如何一般地键入一个 returns 对象数组的值数组的函数?

How to generically type a function that returns a value array of an object array?

我正在尝试键入一个函数,该函数 return 是一个通用对象数组的值数组(用于获取 table 的所有列值)。

class DataSource<T> {
  
  constructor(private data: T[]) {}

  public getColumnValues(column: keyof T): any[] { // this is the thing I don't know how to type!
    return data.map(entry => entry[key]);
  }
}

目标是拥有一个显示正确 return 值的通用签名。例如:getColumnValues('someDate') 应该是 Date[]getColumnValues('someString') 作为 string[]

我试着搜索这个,但我可能无法正确表达我的问题...

您需要使 getColumnValues 成为通用函数,以便类型可以基于特定的 属性 而不仅仅是 T 的任何 属性。我们将 return 该键的属性数组。 K 是键,T[K] 是值,T[K][] 是值数组。

class DataSource<T> {
  
  constructor(private data: T[]) {}

  public getColumnValues<K extends keyof T>(column: K): T[K][] {
    return this.data.map(entry => entry[column]);
  }
}

当您调用该函数时,Typescript 能够推断 K,因此它将 return 正确的类型。

const mySource = new DataSource([{id: 1, name: "John"}, {id: 2, name: "Susan"}]);

const names = mySource.getColumnValues('name'); // type is string[]

const ids = mySource.getColumnValues('id'); // type is number[]

Typescript Playground Link