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

如何让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> }

说明

  1. 新增泛型K extends ResponseKeys,用于捕获调用时传入的具体键值(比如调用传'a',K会被推断为'a')
  2. 返回类型定义为{ [key in K]: Result<T> },仅生成对应K的必选属性,不会包含其他无关键
  3. 受TypeScript类型系统限制,这里需要用as做类型断言,告知编译器返回值符合目标类型

此时调用transform<A>('a')的返回类型与你期望的完全一致:

{
    a: Result<A>;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 02:01:57