overloads 函数重载

最后更新:2026-10-22

overloads 函数重载

重载声明让一个函数拥有多份"签名说明书":调用方按实参形态获得精确的返回类型,实现体只写一份。TS 按声明顺序逐个匹配,全部不中才报错。

分组函数与类
类型语法
严格模式不需要

ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。

📝 语法

function format(value: number): string; // 数字 → 金额
function format(value: Date): string;   // 日期 → 日期串
function format(value: number | Date): string { // 实现签名对外不可见
  return value instanceof Date
    ? value.toISOString().slice(0, 10)
    : `$${value.toFixed(2)}`;
}

⚙️ 参数

f(...): T;只有声明没有函数体,连续写多行;编译器按顺序匹配
f(...) { }唯一带函数体的那份;参数类型必须兼容所有重载,但对调用方不可见

返回值:由命中的重载签名决定——每个重载可以声明不同的返回类型,调用方拿到的是与实参形态对应的精确类型。

▶ 示例

修改下面的代码,点击试一试查看转译运行结果:

输出:

¥42.00
2026-01-15

(转译后运行输出;重载签名在转译后消失——运行时只剩实现函数,没有分支开销)

💡 要点

ℹ️ 说明 编译产物里只剩实现函数——重载签名是纯编译期语法,运行时没有任何额外代码。
⚠️ 注意 实现签名对调用方不可见:它的参数类型必须覆盖所有重载的形态,否则合法调用会在实现签名处报"不匹配"。
💡 提示 重载按声明顺序从上到下匹配:把更具体的签名放前面、宽泛的放后面,否则宽泛签名会抢走本该命中具体签名的调用。
更多案例即将上线。

📚 相关教程

❓ 常见问题

Q 重载和联合类型参数怎么选?
A 入参类型影响返回值类型时用重载(各给一份精确说明);只影响内部处理、返回值一致时用联合参数 + 收窄,代码量更少。
Q 为什么调用报"没有匹配的重载"?
A 检查两点:实参类型是否真的落在某个重载上;签名顺序是否合理(宽泛签名放前面会把后面的具体签名"堵死")。
Q 箭头函数可以写重载吗?
A 不能。重载只支持 function 声明语法;变量场景可用 type Overloaded = { (x: string): A; (x: number): B } 的对象类型形式表达。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏