2017-12-01 7 views
1

TypeScriptでfor (let x in obj)ループを使用しようとしていますが、TypeScriptコンパイラがxの型を正しく認識しません...常に型名がstringと仮定します。TypeScriptコンパイラで変数の型が正しく検出されない

以下の例では、forループ外のタイプobjが正しく検出されています。 TypeScriptコンパイラは、それをnumberとして認識します。ただし、forループ内のobjは、numberである必要がある場合はstringと認識されます。

let myObj: { [key: number]: number } = { 0: 43, 5: 23 }; 

let obj = myObj[0]; // let obj: number 

for (let obj in myObj) { 
    if (obj == 1) { 
     //^[ts] Operator '==' cannot be applied to types 'string' and 'number'. 
     // TypeScript compiler thinks 'obj' is of type 'string' when used in `for in` loop. 
    } 
} 

これは私のコードに誤りがあり、この問題を回避する方法がわかりません。それは私が間違っていることか、それともTypeScriptのバグですか?

+0

あなたのユースケースは何ですか? –

答えて

3

あなたが知っているfor k in oループo以上のプロパティキー、ないその、右?また、JavaScriptはだけは本当に文字列プロパティキーとしてを可能にし、静かに文字列に非文字列を強制します:MDN's documentation for accessing propertiesから

プロパティ名は文字列でなければなりません。つまり、文字列以外のオブジェクトをオブジェクトのキーとして使用することはできません。数値を含む文字列以外のオブジェクトは、toStringメソッドを使用して文字列に型キャストされます。

だからstringとして時にタイプobj活字体が実際に正しいことを意味します

for (let obj in myObj) { 
    console.log(typeof obj); // "string" 
    if (obj === "1") // okay now { 
     myObj[obj] = 123; // okay, property value is a number 
    } 
} 

役に立てば幸いし、がんばろう!

+0

そのキーを数値として使用したいのであれば、 'parseInt'や' parseFloat'のようなものを使う必要がありますか? – Acidic

+1

はい、そのようなものです(例: 'Number(obj)'または '+ obj') – jcalz

関連する問題