TypeScript自学课(7)-type与对象

举报
搞前端的半夏 发表于 2022/04/30 08:42:41 2022/04/30
【摘要】 在之前的文章中,我们用到了不少的基本类型,例如数字,字符串。还有any类型和unknow顶级类型。本文的主角是建立在基本类型的基础之上的复合类型-对象object。对象是属性名和数据类型的任何组合。例如我们有一个用户对象const user = { name: '搞前端的半夏', age: 18, isBoy:true,}为此对象定义类型,可以使用type语法定义!type User ...

在之前的文章中,我们用到了不少的基本类型,例如数字,字符串。还有any类型和unknow顶级类型。

本文的主角是建立在基本类型的基础之上的复合类型-对象object。对象是属性名和数据类型的任何组合。

例如我们有一个用户对象

const user = {
  name: '搞前端的半夏',
  age: 18,
  isBoy:true,
}

为此对象定义类型,可以使用type语法定义!

type User = {
  name: string,
  age: number,
  isBoy: boolean
}

这样我们就得到了一个User类型。有了这个类型,我们就可以给user对象加上类型!

const user: User = {
  name: '搞前端的半夏',
  age: 18,
  isBoy: true,
}

type

在学习更多关于对象的知识点之前,先简单介绍以下type语法。

type,我称之为类型别名,也就是给一个类型起个新名字。它可以用作基本类型,联合类型,复合类型等等类型。

例如,我们可以给string起一个新名字。

type myString=string
let userName:myString;

此时将鼠标放在userName上,你会看到:TS提示你userName是string类型。

image-20220425212145130

例如联合类型

联合类型使用|,表示变量的类型可以是多种类型。

type stringOrNumber = number |string
let variable:stringOrNumber;
variable='123'
variable=123

当然type还有其他用法!!!这里介绍还为时尚早!!!

初始化直接赋值时检查

在上面我们给user对象添加了类型User。当我们为他赋值时,TS会进行类型检查。缺失或者不存在指定属性,都会报错。

const user: User = {
  name: '搞前端的半夏',
  age: 18,
}

属性缺失

我们敲代码的时候不小心少了isBoy属性,TS会立即报错!

image-20220425215133339

不存在指定属性

如果我们加入了一个不存在的属性,TS会立即报错。

const user: User = {
  name: '搞前端的半夏',
  age: 18,
  isBoy: true,
  noExit:false
}

image-20220425215544684

初始时通过其他变量赋值

上面我们是直接给变量,如果我们通过其他变量赋值时,情况就不太一致!

属性缺失

定义一个newUser,不小心少了isBoy。

var newUser= {
  name: '搞前端的半夏',
  age: 18,
}
let user: User =newUser;

同样的TS会报错。

image-20220425220236713

不存在指定属性

var newUser= {
  name: '搞前端的半夏',
  age: 18,
  isBoy:true,
  noExit:false
}
let user: User =newUser;

此时,TS并不会报错。

image-20220425220258204

这是因为TS的类型是结构化类型。也被成为鸭子类型,当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。

TS使用鸭子类型来检查两个对象是否有相同的类型匹配。

这里的newUser有name,有aga,有noExit,那他就符合User类型。

请注意当我们把newUser赋值给user时,只会匹配相同的属性,额外的属性会被屏蔽掉。

我们时用.去获取属性的时候,TS之后提示User类型中的三个。而且

image-20220425222840260

即使我们自己手动使用noExit,TS也会报错。

image-20220425223010303

但是这并不意味着noExit在运行时不存在,我们说过TS是在编译时检查问题的。在开发过程中,TS只是提醒我们noExit不存在,确保我们不会使用类型以外定义的属性。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。