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

如何构建TypeScript函数:提取对象指定键并返回对应Record

解决方案

要实现这个函数,你需要调整泛型参数的定义,让K代表键的联合类型而非数组类型——因为Record的第一个类型参数要求是string | number | symbol(对象键的合法类型),而非数组类型。

正确的TypeScript实现

function myFunc<T, K extends keyof T>(fields: readonly K[]): Record<K, number> {
  return fields.reduce((result, key, idx) => ({ ...result, [key]: idx }), {} as Record<K, number>);
}

代码说明

  1. 泛型参数:
    • T:指定原始对象的类型(比如示例中的Person)。
    • K:约束为keyof T的子集,即只能是T中存在的键的联合类型。
  2. 参数类型:readonly K[]确保输入数组仅包含T的合法键,TypeScript会自动拦截无效键(比如示例中的years)。
  3. 返回类型:Record<K, number>明确返回对象的键是K中的所有值,值类型为数字(对应键在数组中的索引)。
  4. 类型断言:{} as Record<K, number>告诉TypeScript初始空对象的目标类型,因为reduce方法无法自动推断最终的返回类型。

测试示例

type Person = {
  name: string,
  age: number,
  citizen: boolean
}

// 正常调用,返回 { name: 0, citizen: 1 },类型为 Record<'name' | 'citizen', number>
console.log(myFunc<Person>(['name', 'citizen']));

// 错误调用,TypeScript会提示:"years"不能赋值给"name" | "age" | "citizen"类型
console.log(myFunc<Person>(['name', 'years']));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:50:29