如何让TypeScript的Record类型支持不同类型的值?
解决TypeScript中Record无法接受不同类型值的问题
你的问题出在Record<Keys, T>的设计上——它要求所有键对应的值必须是同一类型T,但你传入的对象里name是字符串、qty是数字,类型不统一,所以TypeScript抛出类型不兼容的错误。
要实现接受不同类型值且能正确推断返回值类型的需求,你需要放弃Record的同类型约束,改用泛型来约束对象结构并精确推导类型:
方案1:通用键值获取函数(不限定键名)
如果不需要限制只能使用特定键名,直接让函数支持任意对象的键值获取:
const getValueByKey = <T extends object, K extends keyof T>(items: T, key: K): T[K] => { return items[key]; } // 调用示例 const nameVal = getValueByKey({ name: 'fulan', qty: 1}, 'name'); // nameVal 类型自动推断为 string const qtyVal = getValueByKey({ name: 'fulan', qty: 1}, 'qty'); // qtyVal 类型自动推断为 number
方案2:限定特定键名(保留Keys类型)
如果必须限制只能使用'name' | 'qty'这两个键,结合泛型和你的Keys类型:
type Keys = 'name' | 'qty'; const getValueByKey = <T extends Record<Keys, unknown>, K extends Keys>(items: T, key: K): T[K] => { return items[key]; } // 调用示例 const nameVal = getValueByKey({ name: 'fulan', qty: 1}, 'name'); // nameVal 类型推断为 string const qtyVal = getValueByKey({ name: 'fulan', qty: 1}, 'qty'); // qtyVal 类型推断为 number
为什么原来的Record不行?
Record<K, T>的底层定义是:
type Record<K extends keyof any, T> = { [P in K]: T; }
它强制所有键P对应的值类型都是T,天生是同类型键值对的集合,完全不适合你的多类型值场景。
内容的提问来源于stack exchange,提问作者Shbdn
相关产品推荐
相关产品推荐

