如何一般地键入返回对象数组的值数组的函数?

t-M*_*URO 3 typescript typescript-generics typescript-typings

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

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]);
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Lin*_*ste 7

您需要创建getColumnValues一个泛型函数,以便类型可以基于特定属性,而不仅仅是T. 我们将返回该键的属性数组。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]);
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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[]
Run Code Online (Sandbox Code Playgroud)

打字稿游乐场链接