有没有办法在TypeScript中进行方法重载?

有没有办法用TypeScript语言进行方法重载?

我想实现以下目标:

class TestClass {

someMethod(stringParameter: string): void {

alert("Variant #1: stringParameter = " + stringParameter);

}

someMethod(numberParameter: number, stringParameter: string): void {

alert("Variant #2: numberParameter = " + numberParameter + ", stringParameter = " + stringParameter);

}

}

var testClass = new TestClass();

testClass.someMethod("string for v#1");

testClass.someMethod(12345, "string for v#2");

这是我不想做的一个例子(我真的很讨厌JS中重载hack的那一部分):

class TestClass {

private someMethod_Overload_string(stringParameter: string): void {

// A lot of code could be here... I don't want to mix it with switch or if statement in general function

alert("Variant #1: stringParameter = " + stringParameter);

}

private someMethod_Overload_number_string(numberParameter: number, stringParameter: string): void {

alert("Variant #2: numberParameter = " + numberParameter + ", stringParameter = " + stringParameter);

}

private someMethod_Overload_string_number(stringParameter: string, numberParameter: number): void {

alert("Variant #3: stringParameter = " + stringParameter + ", numberParameter = " + numberParameter);

}

public someMethod(stringParameter: string): void;

public someMethod(numberParameter: number, stringParameter: string): void;

public someMethod(stringParameter: string, numberParameter: number): void;

public someMethod(): void {

switch (arguments.length) {

case 1:

if(typeof arguments[0] == "string") {

this.someMethod_Overload_string(arguments[0]);

return;

}

return; // Unreachable area for this case, unnecessary return statement

case 2:

if ((typeof arguments[0] == "number") &&

(typeof arguments[1] == "string")) {

this.someMethod_Overload_number_string(arguments[0], arguments[1]);

}

else if ((typeof arguments[0] == "string") &&

(typeof arguments[1] == "number")) {

this.someMethod_Overload_string_number(arguments[0], arguments[1]);

}

return; // Unreachable area for this case, unnecessary return statement

}

}

}

var testClass = new TestClass();

testClass.someMethod("string for v#1");

testClass.someMethod(12345, "string for v#2");

testClass.someMethod("string for v#3", 54321);

回答:

根据规范,TypeScript确实支持方法重载,但是它很笨拙,并且包含许多手动检查参数类型的工作。我认为这主要是因为在纯JavaScript中最接近方法重载的地方还包括检查,并且TypeScript尝试不修改实际的方法主体,以避免任何不必要的运行时性能成本。

如果我对它的理解正确,则必须首先为每个重载编写一个方法声明,然后是 一个 检查其参数以确定调用哪个重载的方法实现。实现的签名必须与所有重载兼容。

class TestClass {

someMethod(stringParameter: string): void;

someMethod(numberParameter: number, stringParameter: string): void;

someMethod(stringOrNumberParameter: any, stringParameter?: string): void {

if (stringOrNumberParameter && typeof stringOrNumberParameter == "number")

alert("Variant #2: numberParameter = " + stringOrNumberParameter + ", stringParameter = " + stringParameter);

else

alert("Variant #1: stringParameter = " + stringOrNumberParameter);

}

}

以上是 有没有办法在TypeScript中进行方法重载? 的全部内容, 来源链接: utcz.com/qa/429535.html

回到顶部