我试图创建一个函数,该函数接受一个对象数组,然后接受一个或多个参数,这些参数指定将在该数组上使用的属性.
例如,以下任一项:
update([{ name: 'X', percentage: 1, value: 2 }], 'percentage', 'value');
update([{ name: 'X', foo: 1, bar: 2 }], 'foo', 'bar');
try 1:
function update<T extends { name: string }, A extends keyof T, B extends keyof T>(data: T[], a: A, b: B) {
for (const row of data) {
console.log(row.name, row[a] * row[b]);
row[a] = row[a] * row[b];
}
}
- 当我try 使用
row[a]
作为数字时,我得到了一个错误,因为类型是T[A]
,似乎它不知道这是一个数字 - 当我试图给
row[a]
赋值时,我得到Type 'number' is not assignable to type 'T[A]'.(2322)
try 2:
type Entry<A extends string, B extends string> = { name: string } & Record<A | B, number>;
function update<T extends Entry<A, B>, A extends string, B extends string>(data: T[], a: A, b: B) {
for (const row of data) {
console.log(row.name, row[a] * row[b]);
row[a] = row[a] * row[b];
}
}
- 这解决了使用
row[a]
时的问题,我似乎可以将其用作数字 - 但当我try 将一个数字分配给
row[a]
(或任何与此相关的数字)时,仍然得到Type 'number' is not assignable to type 'T[A]'.(2322)
在JS中,这似乎是一件相当常见的事情,但我不知道如何让Typescript理解它.