TypeScript: 如何为对象动态分配属性
前端人
共 2716字,需浏览 6分钟
· 2021-08-12
❝鬼哥本周将通过几篇优秀的Typescript文章,让大家学习到Typescript一些高级的用法,让大家对Typescript更加的深入理解,并且更好实践到工作当中,【一共五篇文章】,关注我们一起完成这个系列的学习
原文:https://github.com/leslie1943
❞
在JavaScript中我们很容易给对象动态添加属性
let developer = {}
developer.name = 'frontender'
以上代码在 JavaScript 中可以正常运行, 但在 TypeScript 中, 编译器会提示以下异常信息
Property 'name' does not exist on type '{}'.ts(2339)
🚀🚀🚀 使用 索引签名
{}类型表示一个没有包含成员的对象, 所以该类型没有包含name属性. 为了解决这个问题, 我们可以声明一个 LooseObject类型
interface LooseObject {
[key: string]: any
}
let developer: LooseObject = {}
developer.name = 'finder'
该类型使用 索引签名 的形式描述 LooseObject 类型可以接收 key 类型是字符串, 值的类型是any类型的字段. 有了LooseObject类型之后, 我们就可以通过上述代码解决动态添加属性的问题
对于 LooseObject 类型来说, 它的约束是很宽松的. 在一些应用场景中, 我们除了希望能支持动态的属性之外, 也希望能够声明一些必选和可选的属性.
比如对于一个表示开发者的 Developer 接口来说, 我们希望它的 name 属性是必填, 而 age 属性是可选的, 此外还支持动态地设置字符串类型的属性. 针对这个需求我们可以这样做
interface LooseStaticObject {
name: string
age?: number
[key: string]: any
}
let coder: LooseStaticObject = { name: 'semlinker' }
coder.age = 30
coder.city = 'Dalian'
🚀🚀🚀 使用工具类型 Record 定义接口
其实除了使用 索引签名 之外, 我们也可以使用 TypeScript 内置的工具类型 Record 来定义 Developer 接口
// type Record<K extends string | number | symbol, T> = { [P in K]: T; }
// { [P in K]: T } : 属性名称是 string |number | symbol 之一(下面代码中的 string), 属性值是 T 类型(下面代码中的any)
// <K, T>: K 是指属性的类型; T 是指属性的值类型 any指任意类型
interface Developer extends Record<string, any> {
name: string
age?: number
}
let developer: Developer = { name: 'coder', 1: '1' }
developer.age = 22
developer.city = 'Dalian'
// Record<K,T>中的 💛 T 是 string, Value 只能是 string
interface Coder extends Record<string, string> {
name: string
age?: string // 只能是 string
}
let coder: Coder = { name: 'coder' }
// coder.age = 22 // Type 'number' is not assignable to type 'string'.ts(2322)
coder.age = `22`
关注公众号添加鬼哥微信,和鬼哥一起学习
❤️ 看完三件事
如果你觉得这篇内容对你挺有启发,不妨:
点个【在看】,或者分享转发,让更多的人也能看到这篇内容
点击↓面关注我们,一起学前端
长按↓面二维码,添加鬼哥微信,一起学前端
评论
使用 YOLO 进行自定义对象检测
点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达我们知道我们可以专门检测一些对象。那么我们如何训练系统检测自定义对象呢?让我们一步一步来。1. 创建数据集机器是通过数据集学习的。数据集必须包含图像和标签。例如,让我的目标是创建一个检测坦克的系统。我准备了从网上下载的坦克图片。然
小白学视觉
0
架构应该如何来理解?
来源:zhuanlan.zhihu.com/p/141027477👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接:htt
小哈学Java
0
Go早期是如何在Google内部发展起来的
2007年Go诞生于Google,2009年Google正式对外宣布了Go语言的开源!时至今日,距离Go开源已经过去了近15个年头了[1]!Go在Google公司内部究竟是怎样的一个状态呢?前Google员工Yves Junqueira近期撰文从其个人所见所闻谈了Go在Google的历程[2]!这里
GoCN
0
3人运营,不用投流,年翻十倍...这些头部商家如何在得物获得确定性新增长
是新朋友吗?记得先点蓝字关注我哦~这场硬仗一定要打,也一定要打赢。文/靳舒乔珠宝品牌周大生2022年一季报数据显示,2021年周大生营收91.55亿元,门店突破4500家,遂加快线上渠道布局。一次跟得物官方交流,感觉这款App上的年轻人非常活跃,很契合线上发展需求。那时,得物App更名一年有余,正打
调皮电商
2
chatgpt实现NLP基本任务(实体识别、关系抽取、属性抽取、事件抽取、文本分类)
向AI转型的程序员都关注了这个号👇👇👇基础函数一、实体识别抽取文本:驻港部队从1993年初开始组建,1996年1月28日组建完毕,1997年7月1日0时进驻香港,取代驻港英军接管香港防务,驻港军费均由中央人民政府负担。《中华人民共和国香港特别行政区驻军法》规定了驻香港部队的职责为防备和抵抗侵略,保卫
机器学习AI算法工程
10
教你如何在 Linux 系统中查看系统日志
转自:开源LinuxLinux 系统提供了强大的日志功能,可以记录系统和应用程序的各种事件和错误信息。系统日志对于故障排除和性能监控非常重要。一、使用命令行工具查看系统日志1. 使用 journalctl 命令查看系统日志:journalctl 命令是 systemd 日志管理器的客户端工具,它可以
良许Linux
0
如何用 Java 几分钟处理完 30 亿个数据?
来源:c1n.cn/GM8hb👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接:http://116.62.199.48/
小哈学Java
10
“你跟我对象睡了,你还有理了?” 哈师大食堂的大瓜
天下之大,无奇不有。有时候事情总是发生得突如其来,让人猝不及防。哈尔滨师范大学表白墙中的一段话,揭开了一段狗血的校园剧情。“有人知道食堂怎么了吗”这么一句看似普普通通的话,却如同打开了潘多拉魔盒一般,跌宕起伏的剧情更是让人唏嘘不已。“哈哈哈,今天没去二食堂二楼吃饭的,损失大大的”“怎么了,怎么了,怎
逆锋起笔
10