并集类型是否适用于类似/分层的角度2模型类



如果我有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不是nullundefined或空的'':

this.model = getModel();
if (this.model.field2) {
// ...
}

这意味着您没有绑定到实现类型,如果稍后有一个M3B类来替换M3,那么您的代码仍然可以工作。

自动弱类型

如果你不想每次向三个类中的一个添加属性时都更改弱接口,你可以使用以下方法创建一个类型:

interface M extends M1, M2, M3 {
}
type PartialM = Partial<M>;

PartialM类型具有所有三个类的属性,它们都是可选的,因为是现成的Partial映射类型。

最新更新