为什么函数重载不会提示错误


function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: number | string): number | string {
return x + '1';
}

为什么typescript可以重载这个函数?我想限制数字输入数字输出和字符串输入字符串输出。

在我的函数实现中,我故意让数字输入字符串输出。我预计在编译这个ts文件时会抛出一条错误消息,但它没有。为什么?

环境:没有tsconfig.json和tsc版本是4.4.3

Typescript并不完美。查看Github第13235期,了解更多关于这个特殊缺陷的信息。

基本上,您的实现函数不知道重载签名的存在。它的类型是返回string | number,返回string,这是一个完全有效的返回类型。就这么简单。

是的,在这种情况下,即使代码编译没有错误,也可能在运行时出现类型错误。这是一个盲点,没有一个好的方法来掩盖。

为什么它不完美?好吧,从Github的问题来看,这句话让我们对它有了更多的了解

似乎没有太多证据表明人们经常在这里犯错误,我们可以在不引入误报的情况下可靠地检测到这种错误。但真正的问题是,这里的任何实现都将在签名数量上至少为O(n^2(,并且有许多.d.ts文件,每个函数实际上有几十个签名。检查";正确性";每次当错误从一开始就很罕见时,在过载中似乎都不值得。

FWIW,在您的情况下,您可能更喜欢使用泛型。

您希望输出类型取决于输入类型:

function reverse<T extends string | number>(x: T): T {
// ...
}

最新更新