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

如何为每个key获取对应专属类型?TypeScript泛型问题

解决方案:让getType参数与对应key类型绑定

原函数的问题在于泛型T1是整个list共享的,导致所有元素的key被推断为联合类型'a'|'b',进而getType的参数也变成该联合类型。要实现每个getType的参数类型与对应元素的key值绑定,需要让每个元素的类型单独推断,而非共享同一泛型。

修改后的函数声明

declare function func<T extends (string | undefined)[]>(service: {
  list: { [I in keyof T]: { key?: T[I]; getType?: (data: T[I]) => void } };
}): void;

方案说明

  • 泛型T会被推断为list中所有key值组成的元组类型(而非联合类型),比如传入包含'a'和'b'的list时,T会被推断为['a','b']。
  • 通过映射类型{ [I in keyof T]: ... },为list的每个索引I生成对应的元素类型:该元素的key类型为T[I],对应的getType参数类型也严格等于T[I],实现了每个元素的key与getType参数的一一绑定。

调用示例

export const d = func({
  list: [
    { key: 'a', getType: data => data }, // data类型为'a'
    { key: 'b', getType: data => data }, // data类型为'b'
    { getType: data => data }, // data类型为undefined(无key时的情况)
  ],
});

如果不需要支持可选key,可以将泛型约束改为T extends string[],同时把元素类型中的key?:改为key:,进一步收紧类型约束。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:10:17