方法重载?
有没有办法在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中重载黑客的部分):
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确实支持方法重载,但是它很笨拙,包含了大量的手动工作检查types的参数。 我认为这主要是因为最接近你可以得到方法重载在普通的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中的方法重载是一个有用的特性,因为它允许你为需要表示的API的现有库创buildtypes定义。
但是,在编写自己的代码时,您可能可以避免使用可选参数或缺省参数的重载的认知开销。 这是方法重载的更可读的替代方法,同时也保持您的API诚实,因为您可以避免使用不直观的sorting创build重载。
您可以使用默认参数来实现您所需的function:
class TestClass { someMethod(stringParameter: string, numberParameter: number = 0): void { alert("The parameters were " + stringParameter + " and " + numberParameter); } } var testClass = new TestClass(); testClass.someMethod("String 1"); testClass.someMethod("String 1", 5);
或可选参数:
class TestClass { someMethod(stringParameter: string, numberParameter?: number): void { if (numberParameter) { alert("The parameters were " + stringParameter + " and " + numberParameter); } else { alert("I only got " + stringParameter); } } }
我希望。 我也需要这个特性,但是TypeScript需要和没有重载方法的非types化的JavaScript交互操作。 即如果你的重载的方法是从JavaScript调用,那么它只能被分派到一个方法的实现。
关于codeplex的相关讨论很less。 例如
https://typescript.codeplex.com/workitem/617
我仍然认为TypeScript应该生成所有if'ing和切换,所以我们不需要这样做。
class User{ name : string; age : number; constructor(name:string,age:number){ this.name = name; this.age = age; console.log("User " +this.name+ " Created") } getName(name:string = ""):string{ if(name != ""){ return name + " " +this.name; }else{ return this.name; } } }
我认为这应该工作