如何在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
相关产品推荐
相关产品推荐

