如何将T的key限制为数字字段? T [keyof T]是数字

时间:2019-10-03 08:53:10

标签: typescript

我想在以下函数中限制字段参数:

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

1 个答案:

答案 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

Playground