有没有办法用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); } }