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

标签 javascript typescript operator-overloading

我想实现这样的目标:

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语言中如何实现方法重载?

最佳答案

根据规范,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);
    }
}

关于javascript - 如何在 TypeScript 中进行方法重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12688275/

相关文章:

javascript - tinymce 图像插入,第二次工作但不是第一次

javascript - 从 javascript hashmap 迭代键为最后一个元素提供空字符串

c++ - 为什么在 C++ 中重载二元算术运算符的规范实现按值传递第一个论证?

javascript - 如何确保持久对象的私有(private)成员是真正私有(private)的

官方文档中的javascript原型(prototype)关键字

javascript - TypeScript 导出-导入约定

javascript - 如何解析模拟函数中的 Promise?

c++ - 检查类/结构是否有特定的运算符

C++ 2 重载有类似的转换

javascript - 如何创建寻找元素网页游戏