共通のフィールドと固有のフィールドを持つ類似の3つの角度モデルがある場合は、ユニオンタイプM1|M2|M3
を使用するか、欠損フィールドをnullに設定した完全なタイプM3
を定義する必要がありますか?類似した/階層的な角度2のモデルクラスに合併型が適していますか?
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){
...
}
しかし、私たちは連合変数に<span>{{model.field3}}</span>
を参照することはできません、テンプレートに鋳造タイプのオーバーヘッドを必要とする、我々はいくつかの方法でそれをするたびにキャストする必要があります。
asM3(model) { return model as M3; }
M3プロパティにアクセスするたびにキャストする必要があった場合、パフォーマンスが低下することはありませんか? * は、あなたがより良い方法を知っている場合は、私に教えてください:)角度1.xおよびJSで
を、私は<span ng-if="model.field3">{{model.field3}}</span>
で行くと思います。最後に、2の角度に類似/階層に適しユニオン型でありますモデルクラス?それとも、最も広いタイプのM3を使い、タイプをチェックするのではなく、純粋なJSのように現在のフィールドをチェックするだけですか?
角度スタイルのガイドは、モデルのインターフェイスの代わりにクラスを使用することを提案しています。 https://angular.io/guide/styleguide#interfaces モデルがすべてのフィールドをチェックせずにM3であることを確認するにはどうすればいいですか? タイプは、タイプ別名で定義したときに再利用できます。 'type ModelUnion = M1 | M2 | M3; ' – user3468806
それ以外の場合は、同じことを尋ねていました。同じクラスを作成し、isM3()のようなメソッドを定義して、3つのフィールドすべてをチェックすることもできます。 \t クラスM { field1:string; field2:文字列; field3:string; } スーパークラスで受け取る子クラスにフィールドを追加するときに、同じ "スーパー"クラスをimplementsまたはextendsキーワードを使用して作成できます。 – user3468806