2016-07-13 2 views
1

を.MAPタイプIは、次のコード持っている:typescriptですランタイム配列は、使用可能な方法

value.items.mapにエラーを投げている
if (Array.isArray(value.items)) { 
    return Array.prototype.concat.apply(items, value.items.map(function(item, key) { 
     return traverseCallback(item, path.concat(['items', key]), resolve); 
    })); 
    } 

を。エラーは次のとおりです。

Property 'map' does not exist on type 'IObjectSchema | IObjectSchema[]'. 

事がある - 私はどちらかIObjectSchema要素またはそのような要素の配列を扱います。私がArray.isArray...に入ると、私は配列を持っていることを100%確信しているので、配列上で.mapの機能を利用できます。これは明らかなJSです。

しかし、TypeScriptは.mapが利用可能であるとは確信していません。おそらくArray.isArray...が1レベル上がると認識しません。

質問は、変数を型付き要素または型付き要素配列のように使用し、配列の場合は.mapを使用できるようにするにはどうすればよいですか?私のコードはJS正しいと確信していますが、TSはここでエラーを投げます。

答えて

0

コンパイラはタイプIObjectSchema | IObjectSchema[]map方法がない程度に右であるので、あなたはif後に、それはあなたがIObjectSchema[]を扱っていると仮定しても安全だということを伝える必要があります。

あなたは2つのオプションがあります。

は、(1)

if (Array.isArray(value.items)) { 
    return Array.prototype.concat.apply(items, (value.items as IObjectSchema[]).map(function(item, key) { 
     return traverseCallback(item, path.concat(['items', key]), resolve); 
    })); 
} 

キャスト(2)type guards

if (value.items instanceof Array) { 
    return Array.prototype.concat.apply(items, value.items.map(function(item, key) { 
     return traverseCallback(item, path.concat(['items', key]), resolve); 
    })); 
} 

何をやったことは私の第二ソリューションに似ているように思えるが、使用をArray.isArrayを使用している場合、コンパイラは型ガードを認識しません。
typeofまたはinstanceofのみ使用できます。

それでも Array.isArrayを使用したい場合は、独自の型ガードを作成することができます

function isObjectSchemaArray(items: IObjectSchema | IObjectSchema[]): items is IObjectSchema[] { 
    return Array.isArray(items); 
} 

そして:

if (isObjectSchemaArray(value.items)) { ... } 
+0

を(value.items instanceofはアレイ)場合、私は '第二のアプローチを使用{ 'それはまだ同じエラーを返す、なぜなら – ducin

+0

ああ。点線のプロパティで型ガードを使用することは[typescript 2.0からのみサポートされています](https://github.com/Microsoft/TypeScript/wiki/What's-new-in-TypeScript#dotted-names-in-typeguards)。私が提供した 'isObjectSchemaArray'アプローチを試してみてください –

関連する問題