如何构建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>); }
代码说明
- 泛型参数:
T:指定原始对象的类型(比如示例中的Person)。K:约束为keyof T的子集,即只能是T中存在的键的联合类型。
- 参数类型:
readonly K[]确保输入数组仅包含T的合法键,TypeScript会自动拦截无效键(比如示例中的years)。 - 返回类型:
Record<K, number>明确返回对象的键是K中的所有值,值类型为数字(对应键在数组中的索引)。 - 类型断言:
{} 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
相关产品推荐
相关产品推荐

