为何TypeScript重载签名不能含可选参数?示例疑问解析
解惑:为什么
makeDate(1, 3)会报错? TypeScript的函数重载规则很明确:对外暴露的调用规则只看你显式声明的重载签名,实现签名是内部逻辑用的,外部调用根本不认它。
看你的代码:
- 你声明了两个重载签名:一个接受1个参数(timestamp),另一个接受3个参数(m, d, y)
- 最后的函数实现带可选参数,但这个实现签名只是用来统一处理内部逻辑的,外部调用时,TypeScript只会匹配你前面写的那两个重载,不会管实现里的参数定义。
所以当你调用makeDate(1, 3)传2个参数时,TypeScript找遍了前面的重载签名,发现没有一个是接受2个参数的,自然就报错了——它根本不会去看实现里的可选参数。
如果想要支持2个参数的调用,你得显式加一个对应的重载签名,比如:
function makeDate(timestamp: number): Date; function makeDate(m: number, d: number): Date; // 新增接受2个参数的重载 function makeDate(m: number, d: number, y: number): Date; function makeDate(mOrTimestamp: number, d?: number, y?: number): Date { if (d !== undefined && y !== undefined) { return new Date(y, mOrTimestamp, d); } else if (d !== undefined) { return new Date(new Date().getFullYear(), mOrTimestamp, d); } else { return new Date(mOrTimestamp); } } const d3 = makeDate(1, 3); // 现在就不会报错了
总结一下:重载签名是给调用者看的“接口说明”,实现签名是背后的“具体逻辑”,调用者只能按照你写的“接口说明”来调用,不能直接用实现里的参数规则。
内容的提问来源于stack exchange,提问作者yevt
相关产品推荐
相关产品推荐

