使用不同类型的一个参数重载 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 }
}

你可以有检查一个值是否属于某种类型的函数,打字稿有user defined type 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);
    }
}

(code in playground)

在您的示例中,由于传递的值只能是 TypeATypeB,因此不需要额外的 if/else.
但您也可以使用 isTypeB.

如果您需要在代码中的几个地方进行此检查,则此方法很好,但如果您只需要一个功能,那么我认为我会使用两个不同的功能,具体取决于数量重复的代码。