带有数字 属性 的通用参数
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]
也是正确的。
我想创建一个这样的函数:
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]
也是正确的。