typescript - 难以理解的 typescript 泛型函数重载

标签 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 中没有出现错误。

为什么?

最佳答案

TypeScript 与 Java/C# 不同,Type 是运行时的一部分,JavaScript 没有运行时类型限制,没有转换错误,没有类型转换错误,TypeScript 中的所有类型只停留在编辑器中在编译器中,编译后,所有类型都会消失。 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;
}

The reason this does not give any error is, JavaScript can accept any object for string input as it will eventually convert all objects to string, so it does not give wrong implementation error in this case. As long as both parameters are are not explicitly specified.

为了好玩 如果您打开 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; }"

关于typescript - 难以理解的 typescript 泛型函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60754905/

相关文章:

javascript - Angular 8 使用 ngIf 和异步管道来显示和隐藏 HTML 元素

javascript - 如何在 TypeScript React 组件中返回字符串或 JSX 元素?

Python 面向对象编程。编写程序来执行丰富的比较

python - 为什么在类上定义 __getitem__ 使其在 python 中可迭代?

C# 方法重载与接口(interface)参数

javascript - tsconfig.json 中的 "target"属性实际上代表什么?

javascript - 如何在 Angular 农业网格中显示数据

java - 使用运行时给定的类型创建通用映射

C# 泛型方法,new() 构造函数约束中的类型参数

Java 8 和广义目标类型推断