2017-11-08 3 views
1

2つのタイプのいずれかを実行する配列が必要です.AまたはB(BがAを拡張しています)どうすればいいですか?2つのインターフェイスのTypescript結合であいまいなコードが可能

interface Foo { 
    x: string; 
} 

interface Bar extends Foo { 
    y: string; 
    z: number; 
} 

type X = Foo | Bar; 

const arr: Array<X> = [ 
    { x: 'Hello' }, // implements Foo 
    { x: 'John', y: 'Doe', z: 42 }, // implements Bar 
    { x: 'Hello', y: 'World' }, // i want this to throw an error 
]; 

感謝:)

答えて

0

活字体が公称タイプ、唯一の構造のものを持っていません。 つまり、{x:string、y:string}は完全に細かいFooです(一致するタイプのxキーがあり、Fooを必要とするコードは他のキーを無視しても問題ありません)。

interface Foo { 
    _type: 'Foo' 
    x: string 
} 

を、容易に適切な_typeタグとFooの「インスタンス」を作成する関数を作成:実施し、公称の種類をシミュレートし、あなたのタイプに固有のタグを追加することができます。

+0

私が 'const jane:Foo = {x: 'Doe'、y:4}'と書くと、エラーが発生します。同様に、配列が 'const arr:Array 'であれば、arr [1]とarr [2]はスローします。私は 'y? :string'と 'z? :string'を 'Foo'の宣言に変換します。ありがとう:) –

+0

ああ、ビットランダムですが、コンパイラは、割り当てのようないくつかの場所で正確なタイプをチェックします。 – AlexG

関連する問題