2016-05-03 9 views
8

に欠けている私はMyInterface.dic辞書name: valueのようになりたい、私はそれを定義:活字体:次のようにインデックスの署名がタイプ

interface MyInterface { 
    dic: { [name: string]: number } 
} 

は今、私は私のタイプを待って関数を作成:

function foo(a: MyInterface) { 
    ... 
} 

入力:

let o = { 
    dic: { 
     'a': 3, 
     'b': 5 
    } 
} 

私はを期待してい0は正しいように、コンパイラは低下している:なぜ typescriptですが、私のタイプを認識していないトリックを行うlet o: MyInterface = { ... }が、質問は、

foo(o) // Typescript error: Index signature is missing in type { 'a': number, 'b': number } 

私は可能性鋳造があります知っていますか?


エクストラ:oがインライン宣言されている場合、正常に動作します:

foo({ 
    dic: { 
    'a': 3, 
    'b': 5 
    } 
}) 

答えて

9

問題は、型が推論されると、その後、oの種類があるということである。

{ dic: { a: number, b: number } } 

それはありません{ dic: { [name: string]: number } }と同じです。批判的に、一番上の署名では、o.dic['x'] = 1のようなことは許されません。あなたは2番目の署名をしています。

実行時には同等の型です(実際は同じ値です)。しかし、TypeScriptの安全性の大きな部分は、これらが同じではなく、扱うことができるということです明示的に意図されていることがわかっている場合、辞書としてのオブジェクト。これは、あなたが誤ってオブジェクト上に存在しないプロパティを完全に読み書きするのを止めるものです。

解決策は、TypeScriptが辞書として意図されていることを保証することです。それは意味:

  • が明示的にどこかの種類を提供し、それを伝えること、それは辞書だ:

    let o = { dic: <{ [name: string]: number }> { 'a': 1, 'b': 2 } }

  • let o: MyInterface

  • が、それは辞書インラインであることをアサートTypeScriptがあなたのために推論する最初の型であることを確認する:

活字体はそれがちょうど2つのプロパティを持つ通常のオブジェクトだ、とあなたは辞書として後でそれを使用しようと考えている場合があります場合は

foo({ dic: { 'a': 1, 'b': 2 } })

、それが不幸になるでしょう。

+0

> 2番目の署名があります。 実際に私のIDEでは 'o.dicを実行できません。x' – Manu

+1

良いキャッチ、申し訳ありませんが、それは索引構文( 'o.dic ['x'] = 1')だったはずです。更新された例 –

+2

更新!有効な場合、TypeScript 2はこの変換を自動的に行います:https://github.com/Microsoft/TypeScript/wiki/What%27s-new-in-TypeScript#implicit-index-signatures –

関連する問題