typescript获取属性名(TypeScript 中如何限制对象键名的取值范围)
typescript获取属性名
TypeScript 中如何限制对象键名的取值范围当我们使用 TypeScript 时,我们想利用它提供的类型系统限制代码的方方面面,对象的键值,也不例外。
譬如我们有个对象存储每个年级的人名,类型大概长这样:
type Students = Record<string, string[]>;
理所当然地,数据就是长这样:
const students: Students = { Freshman: ["David", "John"], sophomore: [], Junior: ["Lily"], Senior: ["Tom"], };
限制对象键名为枚举
上面数据类型的问题是,年级是有限的几种可值取,而该对象上可任意添加属性,这样显得数据不够纯粹。
所以我们新增枚举,列出可取的值:
export enum Grade { Freshman, sophomore, Junior, Senior, }
现在,把对象的键名限制为上面枚举就行了。
- type Students = Record<string, string[]>; + type Students = Record<Grade, string[]>;
这样我们的数据可写成这样:
const students: Students = { [Grade.Freshman]: ["David", "John"], [Grade.sophomore]: [], [Grade.Junior]: ["Lily"], [Grade.Senior]: ["Tom"], // ❌ Object literal may only specify known properties, and 'blah' does not exist in type 'Students'.ts(2322) blah: ["some one"], };
这样,限制住了对象身上键名的范围,可以看到如果添加一个枚举之外的键会报错。
更加语义化的枚举值
但上面的做法还是有不妥之处,因为枚举值默认是从 0 开始的数字,这样,作为键值就不够语义了,这点从访问对象的属性时体现了出来:
修正我们的枚举,用更加语义的文本作为其值:
export enum Grade { Freshman = "Freshman", sophomore = "sophomore", Junior = "Junior", Senior = "Senior", }
此时再使用该枚举时,得到的就不是无意义的数字了。
如果你愿意,枚举值也可以是中文,
export enum Grade { Freshman = "大一萌新", sophomore = "大二学弟", Junior = "大三学妹", Senior = "大四老司机", }
使用时也是没任何问题的:
键值可选
上面的类型定义还有个问题,即,它要求使用时对象包含枚举中所有值,比如 sophomore
这个年级中并没有人,可以不写,但会报错。
// ❌ Property 'sophomore' is missing in type '{ Freshman: string[]; Junior: string[]; Senior: string[]; }' but required in type 'Students'.ts(2741) const students: Students = { [Grade.Freshman]: ["David", "John"], // [Grade.sophomore]: [], [Grade.Junior]: ["Lily"], [Grade.Senior]: ["Tom"], };
所以,优化类型为可选:
type Students = Partial<Record<Grade, string[]>>;
假若可选的值不是通过枚举定义,而是来自一个数组,
const grades = ["Freshman", "sophomore", "Junior", "Senior"];
这意味着我们需要提取数组中的值形成一个联合类型。
首先利用const assertions 把数组转元组(Tuple)类型,
const grades = <const>["Freshman", "sophomore", "Junior", "Senior"];
再利用 typeof
和 Lookup Types 得到最终的联合类型:
// 实际为 type Keys = "Freshman" | "sophomore" | "Junior" | "Senior" type Keys = typeof grades[number];
最后数据类型和数据可写成:
type Students = Partial<Record<Keys, string[]>>; const students: Students = { Freshman: ["David", "John"], Junior: ["Lily"], Senior: ["Tom"], };
须知这种形式下,对象的 key 与原数组中元素其实没有语法层面的关联,即,编辑器的「跳转定义」是不可用的。
尽量还是保持代码之间的关联才能体现出 TypeScript 的作用,所以像这种只有类型约束而无法建立关联的操作是不建议的。
相关资源
const assertions
keyof and Lookup Types
The text was updated successfully, but these errors were encountered:
以上就是TypeScript 中限制对象键名的取值范围的详细内容,更多关于TypeScript限制对象键名范围的资料请关注开心学习网其它相关文章!
- typescript技巧(为什么TypeScript的Enum会出现问题)
- typescript获取属性名(TypeScript 中如何限制对象键名的取值范围)
- typescript怎么加号(Typescript中的as、问号与感叹号详解)
- 数据类型typescript知多少(一文了解TypeScript数据类型)
- react新手指引页面编写(React+TypeScript进行项目构建案例讲解)
- TypeScript定义接口(interface)案例教程(TypeScript定义接口interface案例教程)
- typescript开发后端(教你使用webpack打包编译TypeScript代码)
- typescript使用技巧(深入理解typescript中的infer关键字的使用)
- 臭名昭著的731部队最高负责人 石井四郎(臭名昭著的731部队最高负责人)
- 王牌部队,你看的剧情我看的时尚(你看的剧情我看的时尚)
- 被鉴定的古董价值300万 当心,你可能遇到诈骗了(被鉴定的古董价值300万)
- 英语难学吗(初中英语难学吗)
- 如何追女孩子(如何追女孩子的技巧和方法)
- 是不是快乐全被你拿走了(而是你得到的)
热门推荐
- 对mysql性能优化的看法(聊聊MySQL的COUNT的性能,看看怎么最快?)
- html5表格设计(Html5饼图绘制实现统计图的方法)
- pythonselenium自动选框(python selenium 弹出框处理的实现)
- docker进入redis容器(Docker配置redis哨兵模式的方法多服务器上)
- 在windows安装docker详细步骤(Docker 部署 Prometheus的安装详细教程)
- vue-router底层实现原理(vue-router history模式服务器端配置过程记录)
- php表单上传文件功能(PHP单文件上传原理及上传函数的封装操作示例)
- wxpython 弹出对话框显示图片(WxPython建立批量录入框窗口)
- python3爬虫实例代码(python3通过selenium爬虫获取到dj商品的实例代码)
- 如何在webpack中搭建项目(如何在webpack项目中调试loader插件)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8