如果我有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?
答案 0 :(得分:1)
这种编程风格让我担心的不是性能 - 它是可维护性的。您最终会遇到与特定类型相关的太多代码。
如果将M2
替换为具有兼容结构的其他合适类型,即使它具有该属性,它也将无法通过instanceof
检查。然后你最终会在整个程序中追逐你的类型检查。
如果可能,请使检查更简单,例如:
interface M {
field1: string;
field2: string;
field3: string;
}
然后,使用弱类型M
,您可以测试该属性是否具有值(这将确保field2
不是null
,undefined
或空{ {1}}:
''
这意味着您不受实现类型的约束,如果稍后有this.model = getModel();
if (this.model.field2) {
// ...
}
类替换M3B
,您的代码仍然有效。
如果您不想在每次向三个类之一添加属性时更改弱接口,则可以使用以下方法创建类型:
M3
interface M extends M1, M2, M3 {
}
type PartialM = Partial<M>;
类型具有所有三个类的属性,并且它们都是可选的,因为它是可立即使用的PartialM
映射类型。