我的代码中有一些相似的部分:
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]);
}
}
您对如何改进此功能有什么建议?
答案 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]);
}
}