2017-12-17 11 views
0

を使用して機能し、そのコードを使用して、エラーを生成します。活字体:異なった結果、このコードを有するtypeof演算子

interface something { 
    [id: string]: string | something; 
} 
let obj: something = { 
    '1': 'str', 
    '2': { 
     '3': 'str' 
    } 
}; 
function isObject(obj: any): boolean { 
    return typeof obj === 'object' && obj !== null; 
} 

for (let key in obj) { 
    const specific = obj[key]; 

    if (isObject(specific)) { 
     for (let id in specific) { 
      //   ^^^// The right-hand side of a 
      // 'for...in' statement must be of type 'any', 
      // an object type or a type parameter 
     } 
    } 
} 

機能コードの代わりに、それisObject(specific)を使用している場合しかし、それがうまく働いています:

if (typeof specific === 'object' && specific !== null) { 
// ... 

なぜですか?コード内の関数を削除する必要がありますか?あなたは機能コード付きifステートメントを使用する場合

+2

'isObject'は*あなたが*その何かがnull以外のオブジェクトで言うかもしれないが、*それは*コンパイラに指示しません。 – jonrsharpe

答えて

3

if文ブロックで活字体コンパイラはspecificのタイプはobjectであるという条件から理解することができます。なぜそれが機能するのですか

機能チェックを使用する場合は、返品タイプをobj is objectのように書くことができます。これはあなたの条件に応じてbooleanを返し、またobjobjectであることをコンパイラーに伝えます。

function isObject(obj: any): obj is object { 
    return typeof obj === 'object' && obj !== null; 
} 

この手法についての詳細は、あなたが読むことができるTypescript Advanced Types

+0

だから、私の場合は 'isObject(obj:any):objはオブジェクトです{' ? – Alex

+0

@Alexはい。そのように –

関連する問題