[英]Typescript method overloading with one parameter of different type (non-primitive)
好的,我想做的很簡單。 我想重載一種方法,以便它可以采用一個非原始類型的參數。
我知道我不能這樣做,因為TypeScript在編譯為JavaScript時會丟失所有類型。 如果參數之一是原始的(例如字符串),我可以做到(typeof myString ==“ string”)。
public doSomething(typeA: TypeA);
public doSomething(typeB: TypeB);
public doSomething(type: TypeA | TypeB) {
if (typeof type == "TypeA") {
... // obviously I can't do that, Javascript got no types
... // typeof type === "object"
}
else if (typeof type == "TypeB") { //the same }
else { //undefined }
}
我想到的是:
public doSomething(typeA?: TypeA, typeB?: TypeB) {
if (typeA) { ... }
else if (typeB) { ... }
else { //undefined }
}
然后我必須這樣稱呼:
doSomething(typeA, undefined); //to call TypeA version
doSomething(undefined, typeB); //to call TypeB version
這樣的設計是否可以接受?還是最好創建兩個單獨的方法?
這種表示法可能更好。 調用該方法時,IDE強制您添加未定義的方法。
public doSomething(typeA: TypeA | undefined, typeB: TypeB | undefined) {
if (typeA) { ... }
else if (typeB) { ... }
else { //undefined }
}
您可以具有檢查某個值是否屬於某種類型的函數,而typescript具有用戶定義的類型guards的概念:
interface TypeA {
x: string;
}
function isTypeA(value: any): value is TypeA {
return Object.keys(value).length === 1 && typeof value.x === "string";
}
interface TypeB {
y: number;
}
function isTypeB(value: any): value is TypeB {
return Object.keys(value).length === 1 && typeof value.y === "number";
}
function doSomething(typeA: TypeA);
function doSomething(typeB: TypeB);
function doSomething(type: TypeA | TypeB) {
if (isTypeA(type)) {
console.log(type.x);
} else {
console.log(type.y);
}
}
( 操場上的代碼 )
在您的示例中,由於傳遞的值只能是TypeA
和TypeB
因此不需要多余的if / else。
但是您也可以使用isTypeB
。
如果您需要在代碼中的幾個地方進行此檢查,那么這種方法是不錯的選擇,但是如果您只需要一個函數,那么我認為我會使用兩個不同的函數,具體取決於重復代碼的數量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.