繁体   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