【发布时间】:2012-09-23 04:30:10
【问题描述】:
有没有办法在 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);
【问题讨论】:
-
@hakre 说起来有点奇怪,因为 TypeScript 已经支持方法重载了。
-
@svick:嗯,你称该方法为重载吗?在你的回答中,方法本身没有重载,如果有一个身体。
-
@hakre 规范确实将其称为方法重载。你当然可以说它不是一个特别好的版本,但我认为你不能说它根本不存在。
-
@svick:我也没说。但在我看来,OP 询问的机会是特定于方法重载的心理模型的。对于头发分裂,我们可以说它是方法签名重载;)
-
这能回答你的问题吗? TypeScript function overloading
标签: javascript typescript operator-overloading