如何通过对象类型与属性键获取对应属性值类型?修复函数类型错误
如何根据对象类型和属性键获取对应值的类型?
你的问题核心在于没有让属性键和对应值的类型建立关联,导致TypeScript无法追踪到当前传入的key对应的具体值类型,而是把value的类型推断成了所有属性值的联合类型。
问题出在哪?
你原来的函数定义:
function toPartial<T>(key: keyof T, value: T[typeof key]): Partial<T> { const partial: Partial<T> = {}; partial[key] = value; return partial; }
这里的typeof key其实是keyof T,所以T[typeof key]等价于T[keyof T]——也就是ExampleType里string | number的联合类型。所以当你传入key="amount"和value="abc"时,因为"abc"属于string(联合类型的一部分),TypeScript不会报错,但这显然不符合你的预期。
正确的解决方案
我们需要把属性键也作为一个泛型参数,让TypeScript明确追踪当前使用的具体键,从而绑定value的类型到该键对应的值类型:
function toPartial<T, K extends keyof T>(key: K, value: T[K]): Partial<T> { const partial: Partial<T> = {}; partial[key] = value; return partial; }
验证示例
用你的ExampleType测试:
type ExampleType = { id: string, amount: number } const key = "amount"; const value = "abc"; // 现在这里会触发类型错误:类型"string"不能赋值给类型"number" toPartial<ExampleType>(key, value); // 正确的用法:传入number类型的value toPartial<ExampleType>("amount", 100); // 正常通过
这样修改后,TypeScript会根据你传入的具体key,自动约束value必须是该键对应的类型,完美解决了你的问题。
内容的提问来源于stack exchange,提问作者Nils
相关产品推荐
相关产品推荐

