如何在TypeScript中进行方法重载?

10 浏览
0 Comments

如何在TypeScript中进行方法重载?

我想实现类似这样的效果:

class TestClass {
    someMethod(stringParameter: string): void {
        alert("变体 #1: stringParameter = " + stringParameter);
    }
    someMethod(numberParameter: number, stringParameter: string): void {
        alert("变体 #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 {
        // 这里可以有很多代码...我不想把它和一般函数中的switch或if语句混在一起
        alert("变体 #1: stringParameter = " + stringParameter);
    }
    private someMethod_Overload_number_string(numberParameter: number, stringParameter: string): void {
        alert("变体 #2: numberParameter = " + numberParameter + ", stringParameter = " + stringParameter);
    }
    private someMethod_Overload_string_number(stringParameter: string, numberParameter: number): void {
        alert("变体 #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; // 对于这种情况来说,这是不可达的区域,是不必要的返回语句
        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; // 对于这种情况来说,这是不可达的区域,是不必要的返回语句
        }
    }
}
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语言中实现方法重载?

0