如何让TypeScript泛型函数返回联合参数指定的键值对象
解决TypeScript中根据传入参数动态生成返回对象类型的问题
你需要给函数的operationName参数单独声明泛型约束,让TypeScript能捕获到你传入的具体键值,而非将其视为整个ResponseKeys联合类型处理,这样就能生成仅包含指定必选键的返回类型。
修改后的代码实现
type ResponseKeys = 'a' | 'b'; interface A { city: string; } interface B { town: string; } interface Result<T> { data: T | null; } // 新增泛型K约束为ResponseKeys,绑定到operationName参数 function transform<T, K extends ResponseKeys>(operationName: K): { [key in K]: Result<T> } { return { [operationName]: { data: null, }, } as { [key in K]: Result<T> }; } console.log(transform<A>('a')); // 返回类型为 { a: Result<A> } console.log(transform<B>('b')); // 返回类型为 { b: Result<B> }
说明
- 新增泛型
K extends ResponseKeys,用于捕获调用时传入的具体键值(比如调用传'a',K会被推断为'a') - 返回类型定义为
{ [key in K]: Result<T> },仅生成对应K的必选属性,不会包含其他无关键 - 受TypeScript类型系统限制,这里需要用
as做类型断言,告知编译器返回值符合目标类型
此时调用transform<A>('a')的返回类型与你期望的完全一致:
{ a: Result<A>; }
内容的提问来源于stack exchange,提问作者Morgoth
相关产品推荐
相关产品推荐

