TypeScript 能手养成之旅 Day 6 物件型别-基础物件型别

前言

今天要来介绍物件型别里面的基础物件,或许会想说那除了基础物件型别以外,不是还有 TypeScript 扩充的型别 EnumTuple 和 函式型别 ? 是的,没错!在後面会一一介绍,每天进步一点点。

基础物件型别推论

当我们定义一个 JSON 格式的 object 时,并没有赋予型别,这时候 TypeScript 会做什麽事呢?

一开始我以为只会告诉我们,这个变数只是个 object 吧!结果很贴心的事发生了,他帮我们做型别推论,并且告诉我们这个变数是什麽型别,里面的属性又是为何种型别,例如: name 属性是 stringage 属性是 number 等等。

咦!那 nullundefined 呢? 会不会有让人担心的结果呢?

结果发现 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 型别推论和注记的执行机制,会根据使用者当下的操作行为,来判断是否要提出错误讯息来提醒使用者。

型别推论:

可接受行为

  1. 整个物件完整相根据对应的值做修改覆写。
  2. 对物件其中属性相对应的型别,修改值。

不可接受的行为

  1. 复写物件缺少或新增属性。
  2. 修改属性值时没有给予错误的型别。

型别注记

可接受行为

  1. 可以直接覆写整个物件,并更动里面的属性(新增或删除)。

不可接受行为

  1. 只能接受整个物件进行覆写,不能直接对物件里面的属性进行调整,包括新增及修改。

<<:  D22 - 如何用 Apps Script 自动化地创造与客制 Google Slides?(三)一次看完所有档案的预览

>>:  Day10 - 建立专案与应用注册

问责制,审计和审计追踪(Accountability, Auditing, and Audit Trail)

审核跟踪通常被视为侦查控件。查看审核跟踪可以发现或发现入侵或不合规的活动。 根据ISO 14641:...

Day7 ROS 工具介绍

在前几天我们大概理解了整个 ROS 的架构,接下来要介绍几个 ROS 开发上蛮常用到的工具。 今天主...

Day21 - 用 Ruby on Rails 抓台湾证券交易所资料-除权除息计算结果表

前言 这篇主要以抓「台湾证券交易所」的「除权除息计算结果表」为主 取得「除权除息计算结果表」CSV ...

Day7_HTML语法4

< address>元素 此元素是用来显示个人、团体的连络资讯,例如:地址、电话、e-m...

[Day1]C# 鸡础观念- C#简介

故事时间 在很久很久以前世界上诞生了C语言, 这是个非常灵活又高效的语言, 在不久之後他的後代C++...