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

TypeScript中如何推断数组对象的键类型并生成强制全键检查的泛型类型

解决方案:实现带全键检查的泛型映射类型

我来帮你搞定这个需求!你需要的SomeType泛型可以通过TypeScript的映射类型结合元组类型推断来实现,既能从元组中提取所有name值作为对象键,又能强制要求所有键必须存在(也就是你说的全键检查)。

正确实现代码

// 定义泛型类型 SomeType
type SomeType<T extends { name: string }[]> = {
  [K in T[number]['name']]: () => void;
};

// 你的示例元组类型
type C = [ {name: 'a'}, {name: 'b'}, {name: 'c'} ]

// 合法声明:通过类型检查
const validObj: SomeType<C> = {
  a: () => {},
  b: () => {},
  c: () => {},
}

// 无效声明:TypeScript 会报错,提示缺少属性 "c"
const invalidObj: SomeType<C> = {
  a: () => {},
  b: () => {},
  // ❌ Error: Property 'c' is missing in type...
}

代码解释

咱们一步步拆解这个泛型的逻辑:

  1. 泛型约束:T extends { name: string }[] 确保传入的泛型参数必须是一个元素包含name字符串属性的元组(或数组),避免传入不符合要求的类型。
  2. 提取联合类型:T[number]['name'] 是关键——它会把元组中所有元素的name属性值提取出来,组成一个联合类型。对于你的C类型来说,这一步得到的是'a' | 'b' | 'c'。
  3. 映射类型生成对象:[K in T[number]['name']]: () => void 遍历联合类型中的每个成员,将其作为对象的键,每个键对应的值固定为() => void函数类型。因为映射类型默认是必填键(不像Partial那样可选),所以只要缺失任何一个键,TypeScript就会触发类型错误,完美实现全键检查。

扩展:自定义函数类型

如果需要让函数支持自定义参数或返回值,可以给SomeType再加一个泛型参数来灵活配置:

type SomeType<T extends { name: string }[], Fn extends Function = () => void> = {
  [K in T[number]['name']]: Fn;
};

// 使用示例:指定函数为 (id: number) => string 类型
const customFnObj: SomeType<C, (id: number) => string> = {
  a: (id) => `a-${id}`,
  b: (id) => `b-${id}`,
  c: (id) => `c-${id}`,
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 22:03:16