虽然约束键的方法对调用者很有效,但函数Typescript内部将无法确定键指定的字段始终是数字,因为在这种情况下,在知道类型参数之前,不会计算条件类型。
通过将键用作泛型类型参数并指定传入的数组必须是一个记录,而作为类型参数传入的键必须是一个数字,我们可以轻松地解决这个问题。当然,我们可以指定一个具有更多键的实体作为参数,但是作为第二个参数传入的键必须指向一个数字字段
const sum = <K extends string>(elements: Record<K, number>[], prop: K) =>
elements.reduce((acc: number, cur) => {
return acc + cur[prop];
}, 0);
type MyEntity = {
p1: number
p2: string,
p3: Date,
p4: number
};
let entities: MyEntity[] = [
{ p1: 1, p2: "str", p3: new Date(), p4: 3 },
{ p1: 2, p2: "str2", p3: new Date(), p4: 1 }
]
sum(entities, "p1");
sum(entities, "p2"); //Error