2016-07-07 56 views
0

我正在將JavaScript庫轉換爲打字稿。我遇到了一個問題,其中一個變量可以是一個布爾值或一個數組。在打字稿中對聯合類型變量使用非共享方法

這不能改變,因爲它是由外部JSON數據提供的 - 而且由於用戶期望數據結構保持不變,所以我不能將它分成兩個變量。

我的問題是即使我可以定義一個聯合類型,我以後訪問的方法一旦這個數組做而不是存在於布爾值上。

所以打字稿與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

這是非常簡單的代碼示例,可以生成我所得到的結果。我怎樣才能解決這個

打字稿理解JavaScript的:)

下面的代碼運行在打字稿精細最新:

var children: boolean | Array<string>; 

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

因爲它有更積極碼流分析;)

更多

TypeScript ve rsion:https://basarat.gitbooks.io/typescript/content/docs/getting-started.html

傳統

您可以打字稿的當前穩定版本,如果你想(我剛剛搬到最新)使用一種類型的後衛。更多類型的後衛:https://basarat.gitbooks.io/typescript/content/docs/types/typeGuard.html

+0

所以你建議我安裝'typescript @ next'版本而不是1.8.10,這樣可以正確處理這個用例呢? – helion3

0

可以使用type guards

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

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

有時候,你需要做的事情有點比一個襯墊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>) { ... }