好的,我想做的很简单。我想重载一个方法,以便它可以采用一个非基本类型的参数。
我知道我不能这样做,因为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 }
}
答案 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);
}
}
在您的示例中,由于传递的值只能是TypeA
和TypeB
,因此不需要额外的if / else。
但您也可以使用isTypeB
。
如果您需要在代码中的几个位置进行此检查,这种方法很好,但是如果只需要那个函数,那么我认为我会使用两个不同的函数,具体取决于重复代码的数量