带有数字 属性 的通用参数

Generic argument with a number property

我想创建一个这样的函数:

insert<T>(target: T, property: keyof T, value: number) {
    target[property] = value;
}

此代码无效。因为 target[property] if 类型 T[keyof T] 和打字稿不允许这种类型的数字。

我试过这样的事情:

insert<T extends {[p in P]: number}, P keyof T>(target: T, property: P, value: number)

但是不行。

我怎样才能让这个功能起作用?

修复是直接使用映射类型的值类型:

function insert<T, K extends keyof T>
(target: T, property: K, value: T[K]) {
    target[property] = value;
}

主要变化是:

  • 第二个通用K
  • 第三个参数类型为 T[K]

因为你的类型只有一个值类型,我们甚至可以有另一种没有第二个泛型的解决方案:

function insert<T extends Record<string, number>>
(target: T, property: keyof T, value: T[keyof T]) {
    target[property] = value;
}

在此上下文中,当所有键都表示相同的值时,T[keyof T] 也是正确的。