能否从元组所有成员推断泛型?同时满足双重类型约束
解决方案:同时约束p参数类型与key3的合法性
可以实现这个需求,核心思路是让泛型绑定数组中每个元素的独立类型,而非统一用全局泛型约束,这样既可以提取所有key2类型的联合,又能保证每个元素的key3是对应key1的键。
实现代码
function get<T extends readonly { key1: K; key2: V; key3: keyof K; }[]>(t: T, p: T[number]["key2"]) { return t; }
验证测试用例
测试1:p参数支持所有key2类型的联合
get( [ { key1: { key: "" }, key2: "", key3: "key" // 合法,"key"是当前元素key1的键 }, { key1: { id: 0 }, key2: 0, key3: "id" // 合法,"id"是当前元素key1的键 } ] as const, "" // 合法,string是key2的类型之一 ); get( [/* 同上数组 */] as const, 0 // 合法,number是key2的类型之一 );
测试2:key3不合法时会触发类型报错
get( [ { key1: { key: "" }, key2: "", key3: "invalidKey" // ❌ 报错:"invalidKey"不是当前元素key1的键 } ] as const, "" );
原理说明
- 泛型
T被约束为数组,数组内每个元素的结构强制要求:key3必须是对应key1的键(keyof K),从根源保证了key3的合法性。 T[number]["key2"]会自动提取数组所有元素key2类型的联合,完美实现了p参数的类型约束。
内容的提问来源于stack exchange,提问作者erce312
相关产品推荐
相关产品推荐

