2017-05-23 16 views
3

私はkeyof Array<...>という2番目の引数を期待するメソッドシグネチャを持っています。 Arrayインターフェイスはインデクサ[n: number]: T;を定義していますので、メソッドのインデックスを参照する方法があると思います。TypeScriptのkeyofとIndexerの互換性はありますか?

しかし、私はどのように見つけることができません。 私は以下を試しました:

MyMethod(myArray, 0); // Argument of type '0' is not assignable to parameter of type ... 
MyMethod(myArray, [0]); // Argument of type 'number[]' is not assignable to parameter of type ... 
MyMethod(myArray, '0'); // Argument of type '"0"' is not assignable to parameter of type ... 
MyMethod(myArray, '[0]'); // Argument of type '"[0]"' is not assignable to parameter of type ... 

そして、何も動作していません。

答えて

2

あなたは、常に試みることができる:

function myFun<T>(arr: Array<T>, index: number) { 
    return arr[index]; 
} 

keyof Array<...>lengthtoStringpushpop、のような数値指標も同様にArrayインタフェースの一部ではない、配列のすべてのプロパティ名を指し、彼らはだからlookup type

interface Array<T> { 
    length: number; 
    toString(): string; 

    ... etc ... 

    [n: number]: T; 
} 

は、シンプルなインターフェースを考えてみましょう:

interface Arr<T> { 
    [n: number]: T; 
} 

const variable: keyof Arr<number>; // variable is of type "never" 

これは実際には言語の欠点です。関連項目this issue on GitHub

数値の文字列リテラルをすべて(効果的に)リストすることはできません。 keyof Container<T>は、number | numericStringとなり、対応する数値リテラルを持つすべての数値ストリングリテラルのタイプとしてnumericStringとなります。 はすべてnumericStringではないため、number | stringは正しくありません。数字には最大値と最小値があるため、数字列のすべての文字列がnumbericStringであるとは限りません。

関連する問題