在学习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中不会发生错误。
为什么?
答案 0 :(得分:2)
TypeScript与Java / C#不同,其中Type是运行时的一部分,JavaScript没有运行时类型限制,没有强制转换错误,没有类型转换错误,TypeScript中的所有Types仅保留在编辑器中,并且在编译器中,编译后所有类型都会消失。而且JavaScript也没有函数重载,因为没有类型,每种类型的对象都可以作为参数传递给函数。
在您的情况下,函数重载仅是声明,并且无法根据实现自动检测错误。它只能基于指定的类型来检测错误。
function concat5<T>(strs: T, strs2: T): T;
仅告诉strs
和strs2
属于同一类型,对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; }"