gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 05:41:30 24 4
gpt4 key购买 nike

好吧,我想做的很简单。我想重载一个方法,以便它可以接受一个非原始类型的参数。

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

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

关于javascript - 使用不同类型的一个参数重载 Typescript 方法(非原始),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40515656/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com