gpt4 book ai didi

typescript - 为什么我不能使用索引类型推断写入对象属性

转载 作者:行者123 更新时间:2023-12-03 22:32:10 24 4
gpt4 key购买 nike

我有这个功能

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但我不能给它写数字

Type '123' is not assignable to type 'T[K]'.

如何解决?

最佳答案

这是按预期工作的。假设您像这样调用 foo:

const obj = {a: 42} as const
foo(obj,"a")
// foo<{readonly a: 42; }, "a">(obj: { readonly a: 42; }, key: "a"): void

那么 T[K] 将不是 number,而是 42(一个子类型)- 123< 的赋值a 将不再有效。在 foo 体内,我们只能确定 T[K] 是某种 number (T< 的通用约束),但不是确切的类型。

因此 TS 将发出错误 Type '123' is not assignable to type 'T[K]' - 编译器无法确保 123 是正确的类型,因为泛型类型由 foocaller 设置。唯一可以静态检查的类型是 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

TS Playground sample

关于typescript - 为什么我不能使用索引类型推断写入对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60831455/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com