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