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

如何实现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]

实现思路说明

  1. 约束输入类型:给K加上readonly (keyof T)[]约束,确保传入的键都是T中存在的有效键
  2. 元组解构递归:用readonly [infer First, ...infer Rest]精确解构元组,保持元组的结构特性(兼容readonly元组场景)
  3. 正确终止递归:当处理到空元组时返回[],避免引入any类型污染结果
  4. 无效键处理:遇到无效键时返回never,可根据业务需求替换为其他默认类型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 06:59:59