TypeScript Record 怎么用
在前端开发中,很多人都遇到过这样的尴尬:定义一个存储用户信息的对象时,一不小心就多写了没用到的属性;或者需要限制对象的键只能是特定几个值,却还要反复检查类型。这时候,一个叫 Record 的工具就能帮上大忙,它是 TypeScript 里用来规范对象结构的“小助手”,用好了能少踩很多类型坑。
什么是 Record?用买菜例子秒懂
Record 说白了就是 TypeScript 给对象做的“规则模板”。举个生活化的例子:你去菜市场买菜,摊位上的菜有固定种类——只能是白菜、萝卜、西红柿这三种,你买的每一样菜都得从这三个里挑,不能乱加。

放到 TypeScript 里,Record 就是这么个“摊位规则”:它需要两个参数,第一个是允许的键的类型(对应菜的种类),第二个是对应的值的类型(对应每种菜的价格)。如果不按这个规则来,TypeScript 就会直接报错,帮你提前揪出错误。
基础用法:先从最简单的场景练手
刚学 Record 不用搞复杂,先写个基础版试试。比如我们要定义一个对象,键只能是“语文”“数学”“英语”这三个科目,每个键对应的值是考试分数(数字类型),写法很简单:
`typescript
type SubjectScores = Record<'语文' | '数学' | '英语', number>;
const myScores: SubjectScores = {
语文: 90,
数学: 95,
英语: 88
};
`
这时候如果少写一个科目,比如漏了“英语”,TypeScript 会直接提示你“属性 '英语' 缺失”;如果多写了“物理”,又会提示“类型中不存在属性 '物理'”,连值写错类型也会报错——比如把“数学”写成 '九十五'(字符串),它会说“不能将类型 'string' 分配给 'number' 类型”。
进阶用法:搭配已有类型更灵活
如果允许的键不是固定的几个字符串,而是从其他类型里取,Record 还能和其他类型搭配用。比如你定义了一个城市列表的类型:
`typescript
type City = '北京' | '上海' | '广州' | '深圳';
`
现在要做一个对象,每个城市对应一个天气字符串,就可以这么写:
`typescript
type CityWeather = Record<City, string>;
const todayWeather: CityWeather = {
北京: '晴',
上海: '阴',
广州: '小雨',
深圳: '多云'
};
`
哪怕后面新增了城市类型,只要在 City 里加,Record 会自动把新城市也纳入检查,不用改 Record 的定义,省了好多重复代码。
还有个常用的小技巧:如果值的类型是复杂的对象,Record 也能hold住。比如要存每个商品的详情(含价格、库存):
`typescript
type Product = { price: number; stock: number };
type ProductMap = Record<string, Product>;
const goods: ProductMap = {
apple: { price: 5, stock: 100 },
banana: { price: 3, stock: 200 }
};
`
这里键用了 string,适合动态的商品名,值固定是 Product 结构,不会出现某个商品漏写库存的问题。
避坑提醒:别用错参数顺序
很多新手第一次用 Record 会踩一个小坑:把两个参数的顺序搞反。比如写成 Record<number, '语文' | '数学'>,意思就变成“键必须是数字,值是科目”,和你想要的完全相反。记住规则:第一个参数是键的类型,第二个是值的类型,别搞混就行。
另外,如果键的类型是联合类型,不能用原始类型直接当键,比如 Record<string | number, string> 其实是合法的,但实际用的时候要注意,数字当对象键会被自动转成字符串,可能出意想不到的问题,尽量把键限定成明确的字符串或字面量类型更稳妥。
用好 TypeScript 的 Record,就像给对象套了一层“安全壳”,既能减少重复的类型定义代码,又能帮你提前发现对象结构的错误,不用等到运行时才踩坑,是前端开发里提升代码质量的实用小工具。