今天要来介绍物件型别里面的基础物件,或许会想说那除了基础物件型别以外,不是还有 TypeScript 扩充的型别 Enum
与 Tuple
和 函式型别 ? 是的,没错!在後面会一一介绍,每天进步一点点。
当我们定义一个 JSON 格式的 object
时,并没有赋予型别,这时候 TypeScript 会做什麽事呢?
一开始我以为只会告诉我们,这个变数只是个 object
吧!结果很贴心的事发生了,他帮我们做型别推论,并且告诉我们这个变数是什麽型别,里面的属性又是为何种型别,例如: name
属性是 string
、 age
属性是 number
等等。
咦!那 null
和 undefined
呢? 会不会有让人担心的结果呢?
结果发现 Nullable Type 被推论对应的型别,而不是 any
,真的是松了一口气。
接下来,我们要来一连串的以不同形式来进行覆写。
如果物件里的属性被赋予不同型别的值或缺少属性都会喷错。
let testPackage = {
name: 'CY',
age: 28,
job: 'developer'
}
当我试着更改 age
的值,由 number
改为 string
,TypeScript 马上就阻止我这麽做了。
testPackage = {
name: 'CY',
age: '28',
job: 'developer',
}
少了某个属性,会被 TypeScript 提醒要补上。
testPackage = {
name: 'CY',
age: 28,
}
多了某个属性,看来也是不行的!
testPackage = {
name: 'CY',
age: 28,
job: 'developer',
quote: 'try'
}
型别错误,导致喷错。
let testPackage = {
name: 'CY',
age: 28,
job: 'developer'
}
testPackage.age = 18 // 同样型别,但值不同,是可以的。
testPackage.age = '28' // 更改为字串,喷错
直接新增属性,会喷错。
let testPackage = {
name: 'CY',
age: 28,
job: 'developer'
}
testPackage.sayHi = () => { return 'hi' } // 直接新增属性,喷错
接下来让我们加上型别注记(testPackage: object
),看比较看看有什麽样的差异。
let testPackage: object = {
name: 'CY',
age: 28,
job: 'developer'
}
// 整个覆写,并新增属性,完全没问题。
testPackage = {
name: 'CY',
age: 28,
job: 'developer',
quote: 'try'
}
// 整个覆写,并减少属性,完全没问题。
testPackage = {
name: 'CY',
age: 28,
}
// 整个覆写,并属性全改,完全没问题。
testPackage = {
test: 'CY',
}
哇!原来加个注记可以改变这麽大喔!从这里可以发现 TypeScript 是可以接受完整覆写。
如果来对值进行新增修改及覆写,会有什麽样的情况呢?
let testPackage: object = {
name: 'CY',
age: 28,
job: 'developer'
}
// 修改原属性的值
testPackage.name = 'Chen'
testPackage.age = '28'
testPackage.job = 'cooker'
// 新增 quote 属性
testPackage.quote = 'try'
看来会直接喷错,因此我们可以知道对於型别注记来说,一旦物件型别注记後,是没有调整的空间的。
从上述的讨论,来做一个小结论,TypeScript 型别推论和注记的执行机制,会根据使用者当下的操作行为,来判断是否要提出错误讯息来提醒使用者。
<<: D22 - 如何用 Apps Script 自动化地创造与客制 Google Slides?(三)一次看完所有档案的预览
审核跟踪通常被视为侦查控件。查看审核跟踪可以发现或发现入侵或不合规的活动。 根据ISO 14641:...
在前几天我们大概理解了整个 ROS 的架构,接下来要介绍几个 ROS 开发上蛮常用到的工具。 今天主...
前言 这篇主要以抓「台湾证券交易所」的「除权除息计算结果表」为主 取得「除权除息计算结果表」CSV ...
< address>元素 此元素是用来显示个人、团体的连络资讯,例如:地址、电话、e-m...
故事时间 在很久很久以前世界上诞生了C语言, 这是个非常灵活又高效的语言, 在不久之後他的後代C++...