有一堂课。让我们说:
class Foo {
a: string;
b: number;
}
和一个函数来获取新的唯一值集。
getUniqueSet<T, K extends keyof T>(arr: T[], key: K): Set<T[K]> {
return new Set<T[K]>(arr.map(item => item[key]))
}
如何使用该函数而不出现以下 TS 错误:
<块引用>“string”类型的参数不能分配给“keyof Foo”类型的参数。
当我使用它时:
const fieldNames: string[] = ['a', 'b'];
const foos: Foo[] = [{a: '1', b: 1}, {a: '2', b: 2}];
fieldNames.forEach((fieldName: string) => {
// Simplified code
let uniqueSet = this.getUniqueSet(this.foos, fieldName);
});
我的目标是传递一组字段名称 (fieldNames
) 并根据 foos
数据集合为每个字段获取唯一值。
答案 0 :(得分:2)
简单:您可以将 fieldNames
定义为 Foo (keyof Foo)[]
的键数组。
并非所有字符串都是 Foo 的键,因此编译器会报错。
const fieldNames: (keyof Foo)[] = ['a', 'b'];
const foos: Foo[] = [{ a: '1', b: 1 }, { a: '2', b: 2 }];
fieldNames.forEach((fieldName) => {
// Simplified code
let uniqueSet = getUniqueSet(foos, fieldName);
});