2017-06-22 94 views
1

我想通過ts聲明兩種類型的變量,但編譯器提示錯誤。 這樣的:如何通過打字稿聲明兩種類型的變量

interface IAnyPropObject { 
 
    [name: string]: any; 
 
} 
 
let a: IAnyPropObject | ((str: string) => any); 
 
a.B = "bbbbbbbb";//tips error 
 
a("");//tips error

注:我不想通過這種方式only.Because代碼的使用「任意」到declare.I只是想約束變量是如此舊的,他們不是TS碼。

+1

** ** ** **類型的變量? **二**?!所以,你說的是,在TypeScript中,一個變量可以同時是一個字符串和一個整數。這怎麼可能? **這太瘋狂了**! – 2017-06-22 02:03:30

+0

TS支持union類型。我只想通過這種方式來約束變量。 –

+0

@Mango,就像你可以同時成爲男性和女性一樣。 – Rudy

回答

1

Mixin vs Union類型的簡要說明。

聯盟:可以是thisthat類型,但不是兩者都有。

interface A { [name: string]: any; } 
interface B { (str: string): string; } 
type UnionType = A | B; 

密新:的this混合,並在同一時間that類型。

interface A { [name: string]: any; } 
interface B { (str: string): string; } 
type MixinType = A & B; 

如果您使用Mixin類型,如果這是您的意圖,您的代碼將工作。變量a可以同時混合使用兩種類型。

+0

要使用&,OP必須傳遞兩種類型的東西,即滿足兩個接口;在這種情況下,函數是一個對象,所以它幾乎是真的,除了可以使用數字通過括號來設置函數屬性,這不應該由OP給出的定義來允許。你可能通過什麼樣的對象來正確實現這兩個接口? –

+0

yeah.I可以省略'if ...' –

+0

感謝您清除此問題! +1欣賞它。 – 2017-06-22 17:00:12

3

如果您使用OR類型,這並不意味着您的對象同時具有兩種類型,您必須對其進行測試並在測試中使用正確的類型。

https://www.typescriptlang.org/docs/handbook/advanced-types.html

interface IAnyPropObject { [name: string]: any; } 
type MyFunc = (str: string) => any; 
let a: IAnyPropObject | ((str: string) => any); 
if (a instanceof Function) { 
    (<MyFunc>a)("hi"); //passing a number will throw an error 
} else { 
    (<IAnyPropObject>a).b = 'bbbbbbbb'; 
} 

你也可以創建一個自定義類型的後衛,但我掛的文件中解釋真實,那麼你就不會投了。還有很多需要說的,我只是從我的手機回答中摸索表面,閱讀文檔瞭解所有細節。

+0

,你的答案是正確的。很感謝。 –

+0

感謝您清理這個! +1欣賞它。 – 2017-06-22 17:00:16