打字稿:使用动态字段名称获取唯一的值列表

时间:2021-05-27 08:29:18

标签: typescript

有一堂课。让我们说:

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 数据集合为每个字段获取唯一值。

1 个答案:

答案 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);
});
相关问题