TypeScript重载匹配错误:异步回调返回类型不符合预期
解决TypeScript重载返回类型不匹配问题
问题原因
你当前的第二个重载返回类型定义为void | Promise<void>,导致TypeScript在匹配异步回调时无法正确推断出应返回Promise<void>;同时重载签名和实际期望的返回类型不匹配,引发了类型推断错误。
解决方案
调整重载的返回类型定义,让异步回调对应的重载明确返回Promise<void>,实现函数的返回类型保持兼容即可:
import cluster from 'cluster'; class Foo { // 同步回调:返回void public runInWorker(cb: () => void): void; // 异步回调:返回Promise<void> public runInWorker(cb: () => Promise<void>): Promise<void>; // 实现函数:返回类型兼容两个重载的联合类型 public runInWorker(cb: () => void | Promise<void>): void | Promise<void> { if (cluster.isPrimary ?? cluster.isMaster) { return; } return cb(); } }
验证结果
- 同步回调场景:
// result类型为void,符合预期 const result = new Foo().runInWorker(() => {}) - 异步回调场景:
// result类型为Promise<void>,符合预期 const result = new Foo().runInWorker(async () => {})
原理说明
TypeScript的重载匹配机制会根据传入参数的类型优先匹配最精确的重载签名。当传入async回调时,其返回类型为Promise<void>,会精准匹配第二个重载,从而推断出返回类型为Promise<void>;实现函数的返回类型void | Promise<void>同时兼容两个重载的返回类型,符合TypeScript的类型检查规则。
内容的提问来源于stack exchange,提问作者Lehks
相关产品推荐
相关产品推荐

