联合类型是否适用于类似/分层角度2模型类?

时间:2017-10-27 08:10:15

标签: angular typescript types casting angular2-template

如果我有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?

1 个答案:

答案 0 :(得分:1)

这种编程风格让我担心的不是性能 - 它是可维护性的。您最终会遇到与特定类型相关的太多代码。

如果将M2替换为具有兼容结构的其他合适类型,即使它具有该属性,它也将无法通过instanceof检查。然后你最终会在整个程序中追逐你的类型检查。

如果可能,请使检查更简单,例如:

interface M {
    field1: string;
    field2: string;
    field3: string;
}

然后,使用弱类型M,您可以测试该属性是否具有值(这将确保field2不是nullundefined或空{ {1}}:

''

这意味着您不受实现类型的约束,如果稍后有this.model = getModel(); if (this.model.field2) { // ... } 类替换M3B,您的代码仍然有效。

自动弱类型

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

M3

interface M extends M1, M2, M3 { } type PartialM = Partial<M>; 类型具有所有三个类的属性,并且它们都是可选的,因为它是可立即使用的PartialM映射类型。