【问题标题】:TypeScript Overload Signature Not Compatible With Rest And Array OverloadsTypeScript 重载签名与 Rest 和数组重载不兼容
【发布时间】:2013-11-04 14:16:48
【问题描述】:

我想创建一个接受字符串数组或允许将字符串作为休息参数提供的方法。当我尝试这个时,我收到一个编译器警告“重载签名不兼容”。

由于rest参数导致一个字符串数组,这不应该可以吗?

class Example {
    test(...strArray: string[]);
    test(strArray: string[]);
    test(strArray: string[]) {
        alert(strArray.length.toString());
    }
}

【问题讨论】:

    标签: typescript


    【解决方案1】:

    其余参数在函数体而不是调用点被打包到一个数组中。 (...strArray: string[]) 重载只会导致第一个参数是一个数组当它是实现签名时,因为rest args 的代码生成是将arguments 打包到一个数组中。其他调用签名的存在不会影响实现签名的代码生成。

    在您的示例中,如果有人调用 test('hi')strArray 将是 'hi',而不是 ['hi']

    【讨论】:

    【解决方案2】:

    可能可以,但编译器采用 [string1,string2]string1,string2 的字面含义,它们不兼容。所以唯一的选择

    class Example {
        test(...strArray: string[]);
        test(strArray: string[]);
        test(strArray: any){
            alert(strArray.length.toString());
        }
    }
    

    您总是可以只使用['a','b'] 包装其余参数的情况:

    【讨论】:

    • 好的答案 - 如果将其余参数用作第一个参数,这将导致 1 的长度将被假定为 strArray
    猜你喜欢
    • 1970-01-01
    • 2017-01-17
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多