当前位置: 首页 > news >正文

typescript - 10.高级类型 Recoed

在 TypeScript 中,Record 是一个内置的泛型工具类型(Utility Type),用于快速定义一个具有指定键类型和值类型的对象类型,本质上是对对象类型的一种简洁封装,避免了重复书写对象的键值类型定义。

一、基本语法

Record<K, T>
  • K:表示对象的键的类型,必须是 stringnumbersymbol 或它们的联合类型(符合 JavaScript 对象键的合法类型)。
  • T:表示对象的值的类型,可以是任意 TypeScript 类型(基本类型、自定义类型、接口等)。

二、核心作用

快速创建一个“键类型统一、值类型统一”的对象类型,替代繁琐的对象字面量类型定义。

三、使用示例

1. 基础用法

// 定义:键为 string 类型,值为 number 类型的对象
type NumberMap = Record<string, number>;// 合法的使用
const ageMap: NumberMap = {'zhangsan': 20,'lisi': 25,'wangwu': 30
};// 错误:值不是 number 类型
// const errorMap: NumberMap = { 'zhaoliu': '35' };

2. 结合字面量类型(限定键的范围)

这是 Record 最常用的场景之一,通过字符串字面量联合类型限定对象的键只能是指定的几个值:

// 限定键只能是 'home' | 'work' | 'school'
type AddressType = 'home' | 'work' | 'school';
// 定义:键为 AddressType 类型,值为 string 类型的对象
type AddressMap = Record<AddressType, string>;// 合法的使用
const userAddress: AddressMap = {home: '北京市海淀区',work: '上海市浦东新区',school: '广州市天河区'
};// 错误:缺少 'school' 键,或多出非指定键都会报错
// const errorAddress: AddressMap = { home: '深圳市南山区', work: '杭州市西湖区' };

3. 结合自定义类型(值为复杂类型)

值类型可以是接口、自定义类型等复杂类型:

// 定义用户信息的接口
interface UserInfo {name: string;age: number;
}// 定义:键为 number 类型(比如用户 ID),值为 UserInfo 类型的对象
type UserMap = Record<number, UserInfo>;// 合法的使用
const userList: UserMap = {1001: { name: '张三', age: 20 },1002: { name: '李四', age: 25 }
};

四、与普通对象类型的对比

1. 普通对象类型定义(繁琐)

type AddressMap = {home: string;work: string;school: string;
};

2. Record 定义(简洁)

type AddressType = 'home' | 'work' | 'school';
type AddressMap = Record<AddressType, string>;

当键的数量较多时,Record 的简洁性优势会更明显。

五、注意事项

  1. K 的类型限制K 必须是可作为对象键的类型(string/number/symbol 及其联合类型),否则 TypeScript 会报错:

    // 错误:boolean 不能作为对象键的类型
    // type ErrorRecord = Record<boolean, string>;
    
  2. Record 是“全量键”类型:如果用字面量联合类型作为 K,则对象必须包含所有指定的键,不能少也不能多(除非使用可选键,可结合 Partial 工具类型):

    type AddressType = 'home' | 'work' | 'school';
    // 结合 Partial 实现可选键
    type OptionalAddressMap = Partial<Record<AddressType, string>>;// 合法:可以只包含部分键
    const partialAddress: OptionalAddressMap = {home: '北京市海淀区'
    };
    
  3. object/{} 的区别

    • object/{} 是宽泛的对象类型,无法限定键和值的类型;
    • Record<K, T> 是精确的类型,明确指定了键和值的类型,类型检查更严格。

六、在 Vue 中的常见场景

在 Vue 应用实例 API 中,app.config.globalPropertiesapp.config.optionMergeStrategies 的类型都用到了 Record

// Vue 源码中对 globalProperties 的类型定义
interface AppConfig {globalProperties: Record<string, any>;
}

这里 Record<string, any> 表示 globalProperties 是一个“键为字符串、值为任意类型”的对象,符合全局属性的使用场景(比如注册 $api$utils 等任意类型的全局属性)。

总结

Record 是 TypeScript 中用于快速定义键值对对象类型的工具,核心价值是简化类型定义、提高代码可读性,尤其适合需要限定对象键值类型的场景,是日常开发中使用频率极高的工具类型之一。

http://www.jsqmd.com/news/79031/

相关文章:

  • 3步搞定移动端语音识别:SenseVoice多语言SDK集成实战
  • DataCopy问题
  • Flink函数扩展终极指南:重塑数据处理能力的10个核心技巧
  • 5分钟掌握Chatterbox:开源语音克隆神器让每个人都能拥有专属声线
  • 销售订单生成后如何快速办理出库?2分钟响应的全流程拆解
  • uni-app跨平台开发终极指南:一套代码多端运行
  • WeUI+移动端UI组件库:告别开发痛点,拥抱高效前端开发
  • project
  • 在线生成图片
  • essay
  • Fiddler 无法抓包手机 https 报文的解决方案来啦!!
  • 生产环境出现问题,测试人如何做工作复盘?
  • 您必须有许可证才能使用此 ActiveX 控件0x80131901
  • Recent Conversations
  • 集成测试之我的初步学习与总结
  • tech-note
  • 当代体系化国学传播奠基人叶无为(字号零) 为国学新时代传承与发展开辟新道路
  • 终极指南:PVNet像素投票网络让6DoF姿态估计变得简单快速
  • 深入解析:2025 年世界职业院校技能大赛机械设计与制造赛道备赛方案
  • 测试工程师:这锅我不背,什么情况测试容易背锅以及化解妙招
  • 终极代码生成解决方案:OpenReasoning-Nemotron-14B快速部署完整指南
  • 学习笔记I
  • Windows系统文件stdftchs.dll丢失或损坏问题 下载修复
  • 终极指南:SmolVLA视觉语言动作模型快速上手与实战应用
  • 终极透明图像生成指南:5分钟掌握sd-forge-layerdiffuse核心技术
  • 光模块电源噪声容忍度测试
  • JavaScript高级:解构赋值和forEach函数
  • 《UNIX高级环境编程》 第七章 进程环境 读书笔记
  • VSCode 插件中集成大模型开发指南:AI 赋能编程体验 - 实践
  • [JSK]动态数列II