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
相关产品推荐
相关产品推荐

