难以理解的打字稿泛型函数重载

时间:2020-03-19 10:09:13

标签: typescript generics overloading

在学习TypeScript时,我注意到了一个奇怪的行为。

function concat5<T>(strs: T, strs2: T): T;
function concat5(strs: string, strs2: string) {
    return strs + strs2;
}

concat5(123, 12);
concat5({a:1}, {b:2});

我认为这段代码是错误的。 但是,IDE中不会发生错误。

为什么?

1 个答案:

答案 0 :(得分:2)

TypeScript与Java / C#不同,其中Type是运行时的一部分,JavaScript没有运行时类型限制,没有强制转换错误,没有类型转换错误,TypeScript中的所有Types仅保留在编辑器中,并且在编译器中,编译后所有类型都会消失。而且JavaScript也没有函数重载,因为没有类型,每种类型的对象都可以作为参数传递给函数。

在您的情况下,函数重载仅是声明,并且无法根据实现自动检测错误。它只能基于指定的类型来检测错误。

function concat5<T>(strs: T, strs2: T): T;仅告诉strsstrs2属于同一类型,对T的类型没有限制。

以下结果将导致错误,表明执行与声明不匹配。

function concat5<T>(strs: T, strs2: number): T;
function concat5(strs: string, strs2: string) {
    return strs + strs2;
}

让我们看看这个例子,

function concat5<T extends number>(strs: T, strs2: T): T;
function concat5(strs: string, strs2: string) {
    return strs + strs2;
}
function concat5<T1 extends number, T2>(strs: T1, strs2: T2): T1;
function concat5(strs: string, strs2: string) {
    return strs + strs2;
}

不给出任何错误的原因是,JavaScript可以接受任何对象作为字符串输入,因为它将最终将所有对象都转换为字符串,因此在这种情况下不会给出错误的实现错误。只要未明确指定两个参数。

为了娱乐 如果您打开Chrome浏览器的控制台并输入{} + {},则会看到结果 [object Object][object Object]。 JavaScript允许任意两种类型的串联,它们会转换为字符串。

>{} + 2
< 2
>2 + {}
<"2[object Object]"
>null + 2
<2
>2 + undefined
<NaN
>2 + (function(){ return 3; })
<"2function(){ return 3; }"