在TypeScript中的方法聲明中,參數可以是字符串,布爾值或數字的數組類型。我是否必須將其聲明爲任何[],或者是否有方法將輸入類型限制爲這三種類型?我可以將參數類型指定爲多種類型之一而不是TypeScript中的任何類型?
回答
Typescript 1.4介紹Union Types所以現在的答案是是的,你可以。
function myFunc(param: string[] | boolean[] | number[]): void;
使用除指定的類型之外的其他類型將觸發編譯時錯誤。
如果需要多個特定類型的數組,你可以使用聯合類型爲以及:
function myFunc(param: (string|boolean|number)[]): void;
注意,這是什麼OP要求不同。這兩個例子有不同的含義。
您可以使用函數重載做到這一點:
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
函數重載可能會有所幫助。 – Amr
由於字符串,布爾和數字都是原始的類型,我不認爲有一個簡單的方法。如果你使用一組不同的對象類型,你可能會想出一個超類,然後在你的方法的接口中指定這個超類。另一方面,您也可以使用方法重載來爲字符串,布爾值和整數數組指定不同的實現。
超級類可以工作,這是一種內置類型,它包含常用的方法和屬性。 – Amr
否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!");
}
另一種方法來解決,這是找到輸入類型之間的公共方法和屬性,並宣佈在保持這些共同methos和屬性方法聲明直列類型。 像這樣:
methodName(param1: { prop1: number; prop2: string; }, param2: { propA: bool; propB: string; }): methodResultType;
這似乎有點老問題,但無論如何,我碰到它,錯過了這個對方的回答是我帶來的。
從打字稿1.4似乎就可以像這樣的函數參數聲明多個可能的類型:
class UtilsClass {
selectDom(element: string | HTMLElement):Array<HTMLElement> {
//Here will come the "magic-logic"
}
}
這是因爲「聯盟型」的新概念打字稿的。
您可以看到更多here。
- 1. Typescript多種類型參數
- 2. 我可以從泛型類繼承而不指定類型嗎?
- 3. 爲什麼我可以轉換爲這種類型而不是其他類型?
- 4. 在Java中,我可以指定任何數量的泛型類型參數嗎?
- 5. 參數類型可能不是指一個抽象類型
- 6. 爲什麼TypeScript不縮小這種類型的後衛中的任何類型?
- 7. 是否可以比較兩種類型,如果一種可以從另一種類型中指定的話?
- 8. 擴展泛型而不指定類型參數的非泛型類型
- 9. 是否可以爲參數指定多個類型提示?
- 10. 如何不指定任何類型創建構造泛型類型參數
- 11. 指定參數類型,而不元組
- 12. 泛型類型參數不是類型?
- 13. TypeScript:類型的參數不可分配
- 14. 一種類型與多種類型
- 15. 我可以指定一個類實例可以轉換爲某種類型嗎?
- 16. 有一個模板參數可以是指針類型或非指針類型
- 17. 如何指定與另一種類型共享類型定義的類型?
- 18. 如何指定不需要其中一種類型的泛型類型?
- 19. 我可以指定類型參數的類型成員的約束嗎?
- 20. 可選的泛型類型,而無需手動指定類型
- 21. 我可以使用反射類型作爲類型參數嗎?
- 22. TypeScript類型的類型
- 23. 如何在類型描述中指定類定義作爲參數類型
- 24. (開放泛型類型)泛型類型,沒有指定參數
- 25. 是否可以使用任意類型參數定義返回類型?
- 26. 流量類型:處理函數的參數,可能是多種類型
- 27. 格式指定類型「詮釋」,但參數的類型是「UIViewContentMode」
- 28. 如何將IN參數指定爲TABLE類型的Oracle數據類型?
- 29. TypeScript類型檢查類型而不是實例
- 30. 匿名類型是否可以繼承另一種類型?
對我來說,它看起來像它可以是完全由一種類型組成的數組,其中該類型可以是字符串,布爾值或數字。那麼一個只能包含這三種類型混合的數組呢? –
我不確定這是OP所要求的,但我仍然編輯了我的答案。你顯然明白這兩者有區別。 – Joao