如何根据函数参数推断返回多种Promise类型的函数结果类型?
如何让TypeScript根据函数参数自动推断Promise返回类型?
当然可以,你只需要借助TypeScript的函数重载或者条件类型+泛型,就能让编译器根据传入的buf参数自动精准推断Promise的返回类型,不用每次手动声明类型或做类型检查。
方案一:函数重载
这是最直观的实现方式,通过定义多个重载签名,明确不同参数对应的返回类型:
// 重载签名:告诉TS不同参数对应的返回类型 async function myFunction(buf: true): Promise<Buffer>; async function myFunction(buf: false): Promise<string>; // 实际实现的函数逻辑 async function myFunction(buf: boolean): Promise<Buffer | string> { const bytes = "00"; if (buf) { return Buffer.from(bytes, "hex"); } else { return bytes; } } (async () => { // TS自动推断x为string,直接调用substring无报错 await myFunction(false).then(x => { x.substring(0); }); // TS自动推断x为Buffer,调用Buffer的方法也没问题 await myFunction(true).then(x => { x.toString("hex"); }); })();
原理:重载签名相当于给TS提供了参数和返回类型的映射规则,当你调用myFunction(false)时,TS会匹配对应的重载签名,直接把返回值推断为Promise<string>,不再是模糊的联合类型。
方案二:条件类型结合泛型
用泛型约束参数类型,再通过条件类型动态生成返回类型:
async function myFunction<T extends boolean>(buf: T): Promise<T extends true ? Buffer : string> { const bytes = "00"; if (buf) { // 这里需要类型断言,因为TS无法自动关联条件类型和返回值 return Buffer.from(bytes, "hex") as any; } else { return bytes as any; } } (async () => { await myFunction(false).then(x => { x.substring(0); // x被精准推断为string }); await myFunction(true).then(x => { x.length; // x被精准推断为Buffer }); })();
原理:泛型T限定为boolean类型,返回类型通过T extends true ? Buffer : string这个条件类型,根据传入的buf具体值动态确定。这里的as any是因为TS编译器暂时无法自动将函数内部的返回值和外部的条件类型关联,属于必要的小妥协。
为什么原来的写法不行?
你最初的函数返回Promise<Buffer | string>,TS无法从调用时的buf参数值(比如false)反向推导返回类型,只能把返回值当成Buffer | string的联合类型,所以调用substring时会报错——因为Buffer没有这个方法。而上面两种方案都是给TS提供了参数和返回类型的明确映射,让它能精准推断。
内容的提问来源于stack exchange,提问作者voldomazta
相关产品推荐
相关产品推荐

