有没有办法在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确实支持方法重载,但它非常笨拙,并且包含很多判断参数类型的手工工作.我认为这主要是因为在普通JavaScript中,最接近方法重载的方法包括判断和TypeScripttry 不修改实际的方法体,以避免任何不必要的运行时性能代价.

如果我理解正确,您必须首先 for each 重载编写一个方法声明,然后再编写one个方法实现来判断其参数,以确定调用了哪个重载.实现的签名必须与所有重载兼容.

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相关问答推荐

当类型不能undefined时,如何使编译器抛出错误?

TypScript中的算法运算式

如何使类型只能有来自另一个类型的键,但键可以有一个新值,新键应该抛出一个错误

使Typescribe强制所有对象具有相同的 struct ,从两个选项

如何在单击停止录制按钮后停用摄像机?(使用React.js和Reaction-Media-Recorder)

适当限制泛型函数中的记录

如何将泛型对象作为返回类型添加到类型脚本中

在分配给类型的只读变量中维护const的类型

为什么我的一个合成函数不能推断类型?

为什么不能使用$EVENT接收字符串数组?

如何使所有可选字段在打印脚本中都是必填字段,但不能多或少?

有什么方法可以类型安全地包装import()函数吗?

如何在方法中正确地传递来自TypeScrip对象的字段子集?

如何通过TypeScrip中的函数防止映射类型中未能通过复杂推理的any值

如何将TS泛型用于react-hook-form接口?

为什么我在这个重载函数中需要`as any`?

如何在Reaction 18、Reaction-Rout6中的导航栏中获取路由参数

记录的子类型<;字符串,X>;没有索引签名

TypeScript是否不知道其他函数内部的类型判断?

Typescript 和 Rust 中跨平台的位移数字不一致