2016-12-21 4 views
1

私は共通インターフェイス(以下Common)から3つのインターフェイス(AB、およびC)をすべて持っています。私はまた、これら3つのインターフェイス(以下Container)の配列を含むコンテナの種類があります。Typescriptの継承インターフェイスとリテラル文字列タイプのキーエラー

getCommonに示したように、私は `)(、アレイのうちの1つをつかむと、オブジェクトから共通プロパティを摘み取るたい:

しかし、活字体2.1は、私のコンパイルを与えている
interface Common { 
    common: boolean; 
} 

interface A extends Common { 
    a: A[]; 
} 

interface B extends Common { 
    b: B[]; 
} 

interface C extends Common { 
    c: C[]; 
} 

type Container = { 
    a: A[], 
    b: B[], 
    c: C[] 
}; 

let item: Container = { 
    a: [ { a: [], common: true } ], 
    b: [ { b: [], common: true } ], 
    c: [ { c: [], common: true } ] 
}; 

type Key = 'a' | 'b' | 'c'; 

function getCommon (thisKey: Key) { 
    return item[thisKey].map(a => a.common); // This line has an error 
} 

Typescript Playground link

エラー:

Cannot invoke an expression whose type lacks a call signature. 
Type '{ <U>(this: [A, A, A, A, A], callbackfn: (value: A, index: number, array: A[]) => U, 
thisArg?: an...' has no compatible call signatures. 

これはTypescriptのバグ/制限ですか、何か間違っていますか?

答えて

0

これは制限のようです。しかし、配列の型を与えてコンパイラを助けることができます:(A | B | C)[]

function getCommon(thisKey: Key) { 
    let arr: (A | B | C)[] = item[thisKey]; 
    return arr.map(a => a.common); 
} 
+0

だから、根本的な問題は、TSコンパイラが 'A [] | B [] 'は' map'プロパティを持っていますが、 '(A | B)[]'はそうすると思いますか?前者のタイプは後者よりも何が起こっているのかを実際に表しているので、それはバマーです(バグのようです)。 – jkjustjoshing

+1

これは望ましくない動作のように思われるので、https://github.com/Microsoft/TypeScript/issues/13097を作成しました。コミュニティ/コアチームがそれについて語っていることがわかります! – jkjustjoshing

関連する問題