如何使用泛型类型改进TypeScript函数?

时间:2019-06-18 14:41:59

标签: typescript

我的代码中有一些相似的部分:

  for (let j = 0; j < this.homeworkList.length; j++) {
    this.homeworkList[
      j
    ].subjectName = LocalService.getDictionaryEntryStatic(
      this.homeworkList[j].subjectId
    );
  }

或者这个:

  for (let j = 0; j < this.data.length; j++) {
    this.data[
      j
    ].name = LocalService.getDictionaryEntryStatic(
      this.data[j].id
    );
  }

如您所见,这两个代码都更改了数组并通过LocalService.getDictionaryEntryStatic()中的值设置了新属性。

我可以为此函数应用通用类型。

  function mapObject<T>(data: T, key: string, newPropertyName:string) {
        for(let i = 0; i < data.length; i++) {
               data[i][newPropertyName] = LocalService.getDictionaryEntryStatic(data[i][key]);
        }
    }

您对如何改进此功能有什么建议?

2 个答案:

答案 0 :(得分:1)

实际上,在这里使用泛型没有什么意义。您可以简单地使用

function mapObject(data: Array<any>, key: string, newPropertyName: string)

或者,如果您要使用泛型,则类似

function mapObject<T extends Array<U>, U extends { [index: string]: any }>(data: T, key: string, newPropertyName: string)

答案 1 :(得分:1)

您可以确保键是数据项的实际属性:

function mapObject<T extends object, U extends keyof T>(
    list: T[], key: U, newPropertyName: string
) {
    for (const item of list) {
        item[newPropertyName] = LocalService.getDictionaryEntryStatic(item[key]);
    }
}

...或根本不使用泛型:

function mapObject(list: object[], key: string, newPropertyName:string) {
    for (const item of list) {
        item[newPropertyName] = LocalService.getDictionaryEntryStatic(item[key]);
    }
}