2017-04-09 6 views
0

で定義された関数にインデックス署名を追加する推奨方法は何ですか:私たちは、私はtypescriptですで定義された関数エルを、持っているとしましょうtypescriptです

function el():string { .. } 

私はタイプ違反を削除したいと思いますが(索引を持ちません後でキーをエルに追加するときに):

el.x =() => {...} 

キャストせずにこれを行うことはできますか?

これまでのところ私が見つけた最良の解決策は、別のインタフェースを定義することで、割り当てながら、それにキャスト:

interface ElFactory { 
    [index: string]:() => string 
(): string 
} 

そして:

(el as ElFactory).x =() => {} 

は完全にキャストを避けることは可能です?で定義されているように、関数を定義している間、それをインタフェースに関連付けるか、関数を定義する際にインデックスの署名を指定しますか?

+0

あなたが探しているものは本当に明確ではありません。いくつか例を挙げてください。現在、私はあなたが 'Function'型を拡張したいように見えますか? – smnbbrv

+0

関数el()として呼び出すことができ、関数メンバー 'el.x()'を持つ変数elが必要です。 – lorefnon

答えて

1

それが作成されたときは、インターフェイスにあなたの関数をキャストすることができます。

interface ElFactory { 
    [index: string]:() => string 
(): string 
} 

var el = function(): string { 
    return "test"; 
} as ElFactory; 

el.test1 =() => "22"; // works 
el.test2 = "22"; // error 

あなたはこれが機能するためにプロパティを定義するためにブラケット表記を使用する必要があります2.2を活字体前:

el["test1"] =() => "22"; // works 
el["test2"] = "22"; // error 
+1

FYI: 'el.test1'と' el.test2'は、TypeScript 2.2以降、うまく動作します。 –

+0

ニース。私はhttp://www.typescriptlang.org/play/でテストしていましたが、これは古いバージョンを実行している必要があります。 – Saravana

関連する問題