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

如何在TypeScript中根据输入接口的特定属性值指定返回类型?

解决方案

要实现根据输入对象的acl属性值返回对应类型,核心是用泛型结合条件类型,将参数的acl属性与返回类型关联起来。你之前的条件类型逻辑错误——把泛型T(属于UploadOpts类型)和响应类型做了extends判断,正确的做法应该是判断T的acl属性值。

正确实现代码

enum FileAcl {
    private = 'private',
    public = 'public',
}

interface UploadOpts {
    someval: string;
    acl: FileAcl;
}

interface PrivateAclResponse {
    acl: FileAcl.private;
    key: string;
}

interface PublicAclResponse {
    acl: FileAcl.public;
    file: string;
}

// 条件类型:根据传入的UploadOpts的acl属性确定返回类型
type UploadResponse<T extends UploadOpts> = T['acl'] extends FileAcl.public 
    ? PublicAclResponse 
    : PrivateAclResponse;

// 泛型函数:让TypeScript根据传入的opts.acl推断返回类型
const uploadFile = async <T extends UploadOpts>(opts: T): Promise<UploadResponse<T>> => {
    const { acl } = opts;

    if (acl === FileAcl.public) {
        return { file: 'file', acl } as UploadResponse<T>;
    }

    return { key: 'key', acl } as UploadResponse<T>;
};

// 调用示例:TypeScript自动推断返回类型
const privateResult = await uploadFile({ someval: 'test', acl: FileAcl.private });
console.log(privateResult.key); // 类型正确,可直接访问key

const publicResult = await uploadFile({ someval: 'test', acl: FileAcl.public });
console.log(publicResult.file); // 类型正确,可直接访问file

关键说明

  • 条件类型UploadResponse:通过T['acl']访问泛型参数T的acl属性,判断其是否为FileAcl.public,从而返回对应的响应类型。
  • 泛型函数定义:将函数参数opts定义为泛型T extends UploadOpts,TypeScript会根据传入的acl值自动推断T的具体类型,进而确定返回类型。
  • 类型断言:函数内部返回时用as UploadResponse<T>帮助TypeScript确认返回值符合推断的类型(也可通过更严格的类型窄化省略断言,断言是最直接的实现方式)。

内容的提问来源于stack exchange,提问作者Ben Walters

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 18:14:59