You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 19:24:10