2017-02-02 6 views
2

タイプスクリプトでは、変数を使用してオブジェクト・キー(プロパティ)にアクセスする方法はありますか?例えば変数を使用してオブジェクト・キーにアクセスします。

interface Obj { 
    a: Function; 
    b: string; 
} 

let obj: Obj = { 
    a: function() { return 'aaa'; }, 
    b: 'bbbb' 
} 

for(let key in obj) { 
    console.log(obj[key]); 
} 

が、エラー・メッセージ以下typescriptですスロー:

OBJ

'はインデックス署名を持たない '任意の 'タイプが原因タイプ'' TS7017要素は暗黙的に有しています'

修正方法?

答えて

3

、あなたはobjで定義されたプロパティの名前だけを返すことが知られていないという意味で型チェックし、Object.keys(obj)機能の型チェックバージョンのいくつかの種類を持っている必要があります。

あり内蔵の活字体私の知る限りではそのような機能はありませんが、あなた自身を提供することができます。

interface Obj { 
    a: Function; 
    b: string; 
} 

let obj: Obj = { 
    a: function() { return 'aaa'; }, 
    b: 'bbbb' 
}; 


function typedKeys<T>(o: T): (keyof T)[] { 
    // type cast should be safe because that's what really Object.keys() does 
    return Object.keys(o) as (keyof T)[]; 
} 


// type-checked dynamic property access 
typedKeys(obj).forEach(k => console.log(obj[k])); 

// verify that it's indeed typechecked 
typedKeys(obj).forEach(k => { 
    let a: string = obj[k]; // error TS2322: Type 'string | Function' 
          // is not assignable to type 'string'. 
          // Type 'Function' is not assignable to type 'string'. 
}); 
0

WebStormのクイックテストとして上記のコードを試しましたが、エラーなしでコンパイルして実行しました。 2.0より前のバージョンのTypescriptを使用している場合は、Typescript 2.0以上を試すことをお勧めします。 --noImplicitAnyでこのコードをコンパイルするために

関連する問題