You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据函数参数推断返回多种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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 10:25:16