使用不同类型的一个参数重载Typescript方法(非原始)

时间:2016-11-09 20:40:55

标签: javascript typescript overloading optional-parameters

好的,我想做的很简单。我想重载一个方法,以便它可以采用一个非基本类型的参数。

我知道我不能这样做,因为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 }
}

1 个答案:

答案 0 :(得分:1)

您可以使用函数检查某个值是否属于某种类型,而typescript的概念是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

如果您需要在代码中的几个位置进行此检查,这种方法很好,但是如果只需要那个函数,那么我认为我会使用两个不同的函数,具体取决于重复代码的数量