如何实现TypeScript的KeysToValues类型,根据键数组返回值类型数组?
实现TypeScript的KeysToValues类型:根据键数组返回对应值类型数组
我们需要实现KeysToValues<T, K>类型,接收对象类型T和由T的键组成的元组K,最终返回对应属性值类型组成的元组。
需求示例:
type KeysToValues<T, K> = any type A = KeysToValues<{a: number, b: string}, ['a', 'b']> // 期望结果:[number, string]
现有实现的问题
你当前的代码返回结果不符合预期(比如KeysToValues<{ a: string }, ['a']>得到[string, ...any[]]),核心问题包括:
- 递归终止条件错误:空元组时返回
any,导致展开后混入...any[] - 剩余元素处理不当:将元组剩余部分
L按数组而非元组结构处理,破坏了类型的精确性 - 缺少对
K的严格约束:未限定K必须是T的键组成的元组,可能引入无效键
正确实现
type KeysToValues<T, K extends readonly (keyof T)[]> = K extends readonly [infer First, ...infer Rest] ? First extends keyof T ? [T[First], ...KeysToValues<T, Rest>] : never // 可替换为你需要的无效键默认类型,比如unknown : [] // 测试验证 type A = KeysToValues<{a: number, b: string}, ['a', 'b']> // 结果:[number, string] type B = KeysToValues<{ a: string }, ['a']> // 结果:[string] type C = KeysToValues<{x: boolean, y: symbol, z: null}, ['z', 'x']> // 结果:[null, boolean]
实现思路说明
- 约束输入类型:给
K加上readonly (keyof T)[]约束,确保传入的键都是T中存在的有效键 - 元组解构递归:用
readonly [infer First, ...infer Rest]精确解构元组,保持元组的结构特性(兼容readonly元组场景) - 正确终止递归:当处理到空元组时返回
[],避免引入any类型污染结果 - 无效键处理:遇到无效键时返回
never,可根据业务需求替换为其他默认类型
内容的提问来源于stack exchange,提问作者Link
相关产品推荐
相关产品推荐

