typescript - 为什么我不能使用索引类型推断写入对象属性
问题描述
我有这个功能
function foo<T extends { [P in K]: number }, K extends keyof T>(obj: T, key: K): void {
const x: number = obj[key]
obj[key] = 123 //error
}
obj[key]
有类型number
,但我不能给它写数字
类型“123”不可分配给类型“T[K]”。
如何解决?
解决方案
这是按预期工作的。想象一下你这样调用foo
:
const obj = {a: 42} as const
foo(obj,"a")
// foo<{readonly a: 42; }, "a">(obj: { readonly a: 42; }, key: "a"): void
Then T[K]
won't be number
, but (a subtype) - to42
的赋值不再有效。在body 内部,我们只知道肯定是某种(的泛型约束),但不知道确切的类型是什么。123
a
foo
T[K]
number
T
因此 TS 将发出错误Type '123' is not assignable to type 'T[K]'
- 编译器无法确保这123
是正确的类型,因为泛型类型是由foo
. 唯一可以静态检查的类型是T[K]
.
要写入number
某些属性K
,您可以按如下方式更改签名:
function foo<K extends PropertyKey>(obj: Record<K, number>, key: K): void {
const x: number = obj[key]
obj[key] = 123
}
const obj = { foo: 1, bar: true }
foo(obj, 'foo') // works
推荐阅读
- python - 不知道如何为 Naoqi python-sdk 设置 PYTHONPATH 变量
- delphi - Techart,由于标题更改而自动重新计算自定义标记区域
- sqlite - SQLITE:如何将 rowid 列转换为常规列
- python - 蟒蛇滚动3个骰子
- logging - 努力对 Moodle 数据库表“mdl_logstore_standard_log”进行正确查询,以便从 GUI 中导出日志
- spring - 春季批处理重试不适用于重试模板
- cordova - 错误运行子进程cordova时发生错误
- javascript - 如何描述扩展方法何时返回 this?
- php - htmlpurifier 产生错误'致命错误:找不到类'HTMLPurifier_AttrTransform_BdoDir''但我的路径是正确的
- r - R CMD 检查中的意外符号库