如果我有3个类似的角度模型,它们具有公共和唯一字段,我应该使用并集类型M1|M2|M3
还是定义一个完整的类型M3
,其中缺少的字段设置为null?
class M1 {
field1: string;
}
class M2 extends M1 {
field2: string;
}
class M3 extends M2 {
field3: string;
}
我可以为所有类似的任务定义联合类型,然后使用instanceof
检查是否需要特定的联合类型。
getModel(): M1|M2|M3 {
}
...
model: M1|M2|M3
...
this.model = getModel();
if(this.model instanceof M3){
...
}
但是,我需要将类型强制转换为模板的开销,我们不能在Union变量中引用<span>{{model.field3}}</span>
,我们确实需要每次通过某种方法强制转换它。
asM3(model) { return model as M3; }
如果每次访问M3属性时都必须进行强制转换,这不会导致性能下降吗?*如果你知道更好的方法,请告诉我:)
在Angular 1.x和JS中,我会使用<span ng-if="model.field3">{{model.field3}}</span>
最后,并集类型是否适用于类似/分层的角度2模型类?或者我应该只使用M3的最宽类型,然后不检查类型,而是检查当前字段,就像在纯JS中一样?
让我担心这种编程风格的不是性能,而是可维护性。您最终会得到太多与特定类型相关的代码。
如果将M2
替换为另一个具有兼容结构的合适类型,则即使它具有属性,它也将无法通过instanceof
检查。然后,你会在整个程序中追逐你的类型检查。
如果可能,简化检查,例如:
interface M {
field1: string;
field2: string;
field3: string;
}
然后,使用弱类型M
可以测试属性是否有值(这将确保field2
不是null
、undefined
或空的''
:
this.model = getModel();
if (this.model.field2) {
// ...
}
这意味着您没有绑定到实现类型,如果稍后有一个M3B
类来替换M3
,那么您的代码仍然可以工作。
自动弱类型
如果你不想每次向三个类中的一个添加属性时都更改弱接口,你可以使用以下方法创建一个类型:
interface M extends M1, M2, M3 {
}
type PartialM = Partial<M>;
PartialM
类型具有所有三个类的属性,它们都是可选的,因为是现成的Partial
映射类型。