2012-10-08 132 views

回答

23

Typescript 1.4介紹Union Types所以現在的答案是是的,你可以

function myFunc(param: string[] | boolean[] | number[]): void; 

使用除指定的類型之外的其他類型將觸發編譯時錯誤。


如果需要多個特定類型的數組,你可以使用聯合類型爲以及:

function myFunc(param: (string|boolean|number)[]): void; 

注意,這是什麼OP要求不同。這兩個例子有不同的含義。

+0

對我來說,它看起來像它可以是完全由一種類型組成的數組,其中該類型可以是字符串,布爾值或數字。那麼一個只能包含這三種類型混合的數組呢? –

+0

我不確定這是OP所要求的,但我仍然編輯了我的答案。你顯然明白這兩者有區別。 – Joao

1

您可以使用函數重載做到這一點:

class Thing { 
    public foo(x: number[]); 
    public foo(x: bool[]); 
    public foo(x: string[]); 
    public foo(x: any[]) { 
     // Note: You'll have to do type checking on 'x' manually 
     // here if you want differing behavior based on type 
    } 
} 

// Later... 
var t = new Thing(); 
t.foo(someArray); // Note: External callers will not see the any[] signature 
+0

函數重載可能會有所幫助。 – Amr

0

由於字符串,布爾和數字都是原始的類型,我不認爲有一個簡單的方法。如果你使用一組不同的對象類型,你可能會想出一個超類,然後在你的方法的接口中指定這個超類。另一方面,您也可以使用方法重載來爲字符串,布爾值和整數數組指定不同的實現。

+0

超級類可以工作,這是一種內置類型,它包含常用的方法和屬性。 – Amr

1

否TypeScript在參數中僅支持單個可選的TypeAnnotation,例如, x: string,數字或任何,所以你不能說明一組允許的類型。

然而,打字稿支持功能重載(文檔P51):

功能重載允許調用由函數所支持的模式的更精確的規格比使用單一的簽名。 [...]

function attr(name: string): string; 
    function attr(name: string, value: string): Accessor; 
    function attr(map: any): Accessor; 
    function attr(nameOrMap: any, value: string): any { 
     if (nameOrMap && typeof nameOrMap === "object") { 
      // handle map case 
     } 
     else { 
      // handle string case 
     } 
    } 

Otherwsie可以使用typeof型檢查,但此計數器類型腳本一點點的類型ascpect。

function myFunc(x){ 
    if(typeof x !== "string" && typeof x !== "object" && typeof x !== "number") 
     throw new TypeError("Unsupported type!"); 
} 
+0

我同意函數重載的想法,但typeof檢查並沒有幫助intellisense。我想我的問題的答案是否定的,但我確實有一個可能真正幫助的答案。我會發布它。 – Amr

+0

對於Typescript 1.4,答案是**是**。檢查我的答案。 – Joao

0

另一種方法來解決,這是找到輸入類型之間的公共方法和屬性,並宣佈在保持這些共同methos和屬性方法聲明直列類型。 像這樣:

methodName(param1: { prop1: number; prop2: string; }, param2: { propA: bool; propB: string; }): methodResultType; 
6

這似乎有點老問題,但無論如何,我碰到它,錯過了這個對方的回答是我帶來的。

從打字稿1.4似乎就可以像這樣的函數參數聲明多個可能的類型:

class UtilsClass { 
    selectDom(element: string | HTMLElement):Array<HTMLElement> { 
     //Here will come the "magic-logic" 
    } 
} 

這是因爲「聯盟型」的新概念打字稿的。

您可以看到更多here

相關問題