2017-10-27 3 views
0

共通のフィールドと固有のフィールドを持つ類似の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のように現在のフィールドをチェックするだけですか?

答えて

1

プログラミングのこのスタイルについて心配しているパフォーマンスではなく、メンテナンス性です。特定の型に結びついたコードが多すぎることになります。

M2を互換性のある構造を持つ別の適切なタイプに置き換えると、プロパティがあるにもかかわらずinstanceofのチェックに失敗します。その後、あなたはあなたのタイプチェックをプログラム全体で追うことになります。

可能な場合は、例えば、チェックを簡単に:

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

を次に、あなたはプロパティに値があるかどうかをテストすることができM弱いタイプを使用して(これはfield2nullundefinedないことを確認します、または''空:これはあなたが持っている場合は、実装タイプにバインドされていないこと

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

を置き換え後のM3Bクラス、あなたのコードはまだ動作します。

自動弱いタイプあなたは、弱いインターフェースあなたがあなたの三つのクラスのいずれかにプロパティを追加するたびに変更したくない場合は

は、次のような使用して型を作成することができます

interface M extends M1, M2, M3 { 
} 

type PartialM = Partial<M>; 

PartialMタイプはすべての3つのクラスのプロパティを持ち、すぐに使用できるPartialマップタイプのため、すべてオプションです。

+0

角度スタイルのガイドは、モデルのインターフェイスの代わりにクラスを使用することを提案しています。 https://angular.io/guide/styleguide#interfaces モデルがすべてのフィールドをチェックせずにM3であることを確認するにはどうすればいいですか? タイプは、タイプ別名で定義したときに再利用できます。 'type ModelUnion = M1 | M2 | M3; ' – user3468806

+0

それ以外の場合は、同じことを尋ねていました。同じクラスを作成し、isM3()のようなメソッドを定義して、3つのフィールドすべてをチェックすることもできます。 \t クラスM { field1:string; field2:文字列; field3:string; } スーパークラスで受け取る子クラスにフィールドを追加するときに、同じ "スーパー"クラスをimplementsまたはextendsキーワードを使用して作成できます。 – user3468806

関連する問題