2017-01-04 10 views
0

は、私はこのようなスニペットを持ってtypeguardsここのコンセプトを理解する。誰でもどうぞ?typescriptです組合の種類は

+3

] |文字列 '' any'または 'any [] | 'に' obj'を定義する必要があります。文字列 ' – ranakrunal9

答えて

0

ファンクションtest()ファンクションtest()ファンクションtest()は、変数によって宣言された「より広い」タイプを返します。これまでのところ、typescriptは、関数が常に配列インスタンスを返すことを確認できません。あなたが実際にあなたが言及しているtypeguardsを使用する必要があります問題、型ガード付き例えば

function test(): any[] | string 
{ 
    return [1, 2]; 
} 

let val = test(); 
if (val instanceof Array) 
{//no error here 
    let obj: any[] = val; 
} 
0

を修正するには、活字体は、労働組合の種類を絞り込むことができます。あなたは、単に絞り込み条件を使用していますが、型ガード機能を追加すると、あなたに追加の再利用性と柔軟性を与えることができます。

function isAnyArray(value: any[] | string): value is any[] { 
    return value instanceof any[]; 
} 

ですから、定期的に自分の割り当てを行い、その後、あなたのタイプのガードが提供する範囲で動作することができます:

let obj: string | any[] = test(); 

if (isAnyArray(obj)) { 
    //Use obj here as if it were an any[] 
} 

あなたが複数の場所であなたの組合を使用しているので、あなたはそれのためのタイプを定義することができますし、手動union型の代わりにそれを使用する:あなたはタイプの `test``任意の[が定義されているよう

type StringOrAnyArray = string | any[]; 
//... 
function isAnyArray(value: StringOrAnyArray): value is any[] { 
    return value instanceof any[]; 
} 
//... 
let obj: StringOrAnyArray = test(); 

if (isAnyArray(obj)) { 
    //Use obj here as if it were an any[] 
}