2016-09-25 469 views
1
type MyStructure = Object[] | Object; 

const myStructure: MyStructure = [{ foo: "bar" }]; 

myStructure.map(); // Property 'map' does not exist on type 'MyStructure'. any 

ライブラリは、このオブジェクトのオブジェクトまたは配列を配信します。どのように入力すればいいですか?プロパティ 'map'が型オブジェクトに存在しません

EDIT

そして、どのように私は、オブジェクトになりますmyStructureの場合にmyStructure["foo"]などのプロパティにアクセスすることができますか?

答えて

0

あなたのタイプはオブジェクトを持つことができることを意味するか、配列を持つことができることを意味します。 TypeScriptでは、どのメンバーが適切かを判断できません。

お使いの場合には
type MyStructure = Object[]; 

、実際のソリューションは、あなたが持っていることを確認するタイプのガードを使用するようになります。これをテストあなたのタイプを変更すると、あなたはmap方法が利用可能になりました表示されますし

mapメソッドを使用する前に配列を作成してください。

if (myStructure instanceof Array) { 
    myStructure.map((val, idx, []) => { }); 
} 
あなたはまた、例えば、 MyStructureのわずかに異なる定義を使用して、あなたの問題を解決することができ

type MyStructure = any[] | any; 

または狭い:

class Test { 
    foo: string; 
} 

type MyStructure = Test[] | Test; 
+0

私は実際に_.isArrayでこれをしませんでした( )、もちろんTypeScriptでは動作しません...あなたの助けてくれてありがとう! – kraftwer1

+1

@Sohnee、これがなぜ機能するのか知っていますか?type MyStructure = number [] | number; '[Playground](https://www.typescriptlang.org/play/index.html#src=%0D%0Atype%20MyStructure%20%3D%20number%5B%5D%20%7C%20number%3B% 0D%0A%0D%0Alet%20MyStructure%3A%20MyStructure%20%3D%20%5B3%5D%3B%0D%0A%0D%0AmyStructure.map(n%20%3D%3E%20n * 2)%3B %0D%0AmyStructure%20%3D%205%3B)? –

+0

問題を引き起こすのは 'Object'だけです。 'any'を使う方法と、mapメソッドで使うものを定義するクラスを使う(おそらくもっと便利な)二つの例を参照してください。マップするメソッドの中でより良い型情報が得られます。 – Fenton

関連する問題