typescript函数重载通过编译期签名匹配实现,由多个无函数体的重载签名和一个兼容所有签名的实现签名组成;签名须从具体到宽泛排列,实现签名参数为联合类型并需类型守卫区分逻辑,且仅function声明支持重载。

TypeScript 处理函数重载的方式不是靠运行时分发,而是靠编译期的类型检查与签名匹配。它通过分离“声明”和“实现”两个层面,让同一个函数名支持多种调用形式,同时保持类型精准和调用明确。
重载由多个签名 + 一个实现组成
重载必须包含至少两个重载签名(overload signatures),每个只写参数类型和返回类型,不带函数体;最后跟一个兼容的实现签名(implementation signature),含完整逻辑。
- 重载签名是给 TypeScript 编译器看的“契约”,决定哪些调用合法、返回什么类型
- 实现签名是实际执行的代码,参数类型必须能覆盖所有重载签名的联合情况
- 实现签名本身不能被直接调用——它只是底层支撑,调用时始终走重载签名路径
签名顺序影响匹配结果
编译器按重载签名从上到下的顺序尝试匹配实参类型,一旦符合就停止,不会继续往下找。所以更具体的签名要放在前面,宽泛的放后面。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 例如:先写
function fn(s: string): number,再写function fn(s: any): string - 如果反过来,第一个签名就会被第二个宽泛签名拦截,导致精确类型失效
- 参数个数不同、类型不同、可选性不同,都构成独立的重载分支
实现签名必须兼容所有重载
实现函数的参数类型是各重载签名的并集,返回类型是各签名返回类型的并集,但内部需手动做类型守卫判断具体分支。
- 比如两个重载分别接受
string和number,实现参数就得是string | number - 返回值类型也相应是
string | number,但函数体内要用typeof或Array.isArray等区分处理 - 若实现签名太窄(如只写
string),会报错:“Implementation is not compatible with signature”
重载不能用于箭头函数或函数表达式
只有 function 声明语句(function keyword)支持重载语法。箭头函数、const 声明的函数表达式、方法简写都不行。
- 因为重载依赖于函数名绑定和签名前置声明,而箭头函数没有名称且语法不允许多签名
- 替代方案可用泛型 + 类型守卫,或拆成多个具名函数,视场景权衡可读性与类型精度










