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

TypeScript中根据对象Key推断Input.default类型的数组定义问题

解决TypeScript数组元素根据key自动推断default类型的问题

你需要把Input定义为联合类型,遍历目标对象的所有键,为每个键生成对应的类型约束,这样数组里的每个元素就能各自根据key匹配对应的default类型。

正确的类型定义

type Input<T> = {
  [K in keyof T]: {
    key: K;
    default: T[K];
  };
}[keyof T];

这个类型的逻辑很直接:

  • 通过映射类型[K in keyof T]遍历T的所有键K,为每个键生成一个{ key: K; default: T[K] }的子类型
  • 再通过[keyof T]把映射类型转换成所有子类型的联合类型,这样数组的每个元素可以是联合中的任意一种,且各自的key和default类型严格绑定

使用示例

type BizType = { foo: string, bar: boolean };

// 定义数组类型
var biz: Input<BizType>[];

biz = [
  { key: "foo", default: "example" }, // 正确,default匹配string类型
  { key: "bar", default: true }, // 正确,default匹配boolean类型
  { key: "bar", default: "not boolean" } // 报错:类型"string"无法赋值给"boolean"
];

为什么原来的写法行不通

你最初定义的Input<T, T2 extends keyof T>需要显式指定第二个泛型参数T2,这会导致数组里的所有元素都必须遵循同一个T2对应的类型约束(比如指定T2="bar"后,所有元素的default都必须是boolean),完全无法满足数组元素使用不同key的需求。而联合类型的写法正好解决了这个问题,让每个元素可以独立匹配对应key的类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:52:15