簡體   English   中英

使用不同類型(非原始)的一個參數重載的Typescript方法

[英]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);
    }
}

操場上的代碼

在您的示例中,由於傳遞的值只能是TypeATypeB因此不需要多余的if / else。
但是您也可以使用isTypeB

如果您需要在代碼中的幾個地方進行此檢查,那么這種方法是不錯的選擇,但是如果您只需要一個函數,那么我認為我會使用兩個不同的函數,具體取決於重復代碼的數量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM