2016-07-07 7 views
0

JavaScriptスクリプトライブラリをtypescriptに変換しています。私は、1つの変数がブール型でも配列型でもよい問題に取り掛かっています。typescriptのユニオン型変数に非共有メソッドを使用する

これは外部のJSONデータによって供給されるため変更できません。ユーザーはデータ構造が変更されないことを期待しているため、2つの変数に分割することはできません。

私の問題は、ユニオンタイプを定義することができますが、これは後でアクセスするメソッドが配列なのでではなく、ブール値にが存在することです。

のでtypescriptですがerror TS2339: Property 'push' does not exist on type 'boolean | string[]'.

var children: boolean | Array<string>; 

children = []; 
children.push('test'); 

と文句を言うこれは私が取得しています結果を生成する非常に簡単なコード例です。これを回避するにはどうしたらいいですか?

+0

[any](https://www.typescriptlang.org/docs/handbook/basic-types.html#any)タイプが機能するのですか、それを回避しようとしていますか? –

+0

それはうまくいく、私はそう一般的ではないが、私は選択肢がないと確信している。 – helion3

答えて

0

これは私が得ている結果を生成する非常に簡単なコード例です。 )

;それはより積極的なコードフロー分析を持っているので

var children: boolean | Array<string>; 

children = []; 
children.push('test'); 

:どのように私はこの

活字体ではJavaScriptを理解し:)

次のコードは、最新の活字体で細かいを実行を回避することができます

さらに

TypeScript ve rsion:あなたは(私は最新に移動したい)したい場合は、活字体の現在の安定版で型ガードを使用することができますhttps://basarat.gitbooks.io/typescript/content/docs/getting-started.html

レガシー

。型ガードの詳細:https://basarat.gitbooks.io/typescript/content/docs/types/typeGuard.html

+0

1.8.10の代わりに 'typescript @ next'をインストールして、このユースケースを適切に処理するようにアドバイスしていますか? – helion3

0

あなたはtype guardsを使用することができます。

if (children instanceof Array) { 
    children.push('test'); 
} 

または

if (typeof children === "boolean") { 
    // children is boolean 
} 

時々、あなたは1つのライナーconsole.logよりも少し複雑な何かをする必要があり、その後、それは便利です可能な異なるタイプに対処する異なる機能を有するようにする:

var children: boolean | Array<string>; 
if (children instanceof Array) { 
    useChildrenArray(children); 
} else { 
    useChildrenBoolean(children); 
} 

function useChildrenBoolean(children: boolean) { ... } 
function useChildrenArray(children: Array<string>) { ... } 
関連する問題