我想在以下函数中限制字段参数:
function sum<T>(source: T[], field: keyof T) {
for(const item of source) {
}
}
以使item[field]
始终是数字。
有可能吗?
编辑:
此外,如何重串非泛型函数参数:
function foo(field:MyObj的键){ }
这样
interface MyObj { name: string, value: number; }
foo("name"); // throws compiler error
答案 0 :(得分:1)
您可以使用Record
类型将field
的属性值限制为仅这样的数字:
function sum<T extends Record<K, number>, K extends string>(source: T[], field: K) {
let sum = 0
for(const item of source) {
const s = item[field] // Record<K, number>[K], canonical number
sum = sum + s
}
return sum
}
测试:
sum([{foo: "adsf", myField: 3}, {myField: 10}], "myField") // OK, sum: 13
sum([{myField: 3}, {myField: "duuhh"}], "myField") // error