TypeScript 数据类型

原文来自阮一峰的博客

特殊类型

any 类型

any 类型表示没有任何限制,该类型的变量可以赋予任意类型的值。

unknown 类型

为了解决 any 类型「污染」其他变量的问题,TypeScript 3.0 引入了 unknown 类型。

unknown 类型跟 any 类型的相似,但二者的区别在于:

  • unknown 类型的变量,不能直接赋值给其他类型的变量(除了 any 类型和 unknown 类型)
  • unknown 类型变量能够进行的运算是有限的,只能进行比较运算、取反运算、typeof 运算符和 instanceof 运算符这几种

从集合论的角度看,any 类型可以看成是所有其他类型的全集,包含了一切可能的类型。TypeScript 将这种类型称为「顶层类型」(top type),意为涵盖了所有下层。

never 类型

never 类型称为「空类型」,该类型为空,不包含任何值。

TypeScript 就相应规定,任何类型都包含了 never 类型。因此,never 类型是任何其他类型所共有的,TypeScript 把这种情况称为「底层类型」(bottom type)。

类型分类

JavaScript 语言将值分成 8 种类型。

  • boolean
  • string
  • number
  • bigint
  • symbol
  • object
  • undefined
  • null

TypeScript 继承了 JavaScript 的类型设计,以上8种类型可以看作 TypeScript 的基本类型。

注意,上面所有类型的名称都是小写字母,首字母大写的 NumberStringBoolean 等在 JavaScript 语言中都是内置对象,而不是类型名称。

另外,undefinednull 既可以作为值,也可以作为类型,取决于在哪里使用它们。

这 8 种基本类型是 TypeScript 类型系统的基础,复杂类型由它们组合而成。

包装对象类型

JavaScript 的 8 种类型之中,undefinednull 其实是两个特殊值,object 属于复合类型,剩下的五种属于原始类型(primitive value),代表最基本的、不可再分的值。

  • boolean
  • string
  • number
  • bigint
  • symbol

上面这五种原始类型的值,都有对应的包装对象(wrapper object)。所谓「包装对象」,指的是这些值在需要时,会自动产生的对象。

五种包装对象之中,symbol 类型和 bigint 类型无法直接获取它们的包装对象(即 Symbol()BigInt() 不能作为构造函数使用),但是剩下三种可以。Boolean()String()Number()

包装对象类型与字面量类型

由于包装对象的存在,导致每一个原始类型的值都有包装对象和字面量两种情况。

为了区分这两种情况,TypeScript 对 5 种原始类型分别提供了大写和小写两种类型。

  • Boolean 和 boolean
  • String 和 string
  • Number 和 number
  • BigInt 和 bigint
  • Symbol 和 symbol

建议只使用小写类型,不使用大写类型。TypeScript 把很多内置方法的参数,定义成小写类型,使用大写类型会报错。

Object 类型与 object 类型

大写的 Object 类型代表 JavaScript 语言里面的广义对象。所有可以转成对象的值,都是 Object 类型,这囊括了几乎所有的值。

小写的 object 类型代表 JavaScript 里面的狭义对象,即可以用字面量表示的对象,只包含对象、数组和函数,不包括原始类型的值。

值类型

TypeScript 规定,单个值也是一种类型,称为「值类型」。

联合类型与交叉类型

联合类型(union types)指的是多个类型组成的一个新类型,使用符号 | 表示。

联合类型 A|B 表示,任何一个类型只要属于 A 或 B,就属于联合类型 A|B。

交叉类型(intersection types)指的多个类型组成的一个新类型,使用符号 & 表示。

交叉类型 A&B 表示,任何一个类型必须同时属于 A 和 B,才属于交叉类型 A&B,即交叉类型同时满足 A 和 B 的特征。

交叉类型常常用来为对象类型添加新属性。

对类型进行操作

type 命令用来定义一个类型的别名。

JavaScript 语言中,typeof 运算符是一个一元运算符,返回一个字符串,代表操作数的类型。

TypeScript 将 typeof运算符移植到了类型运算,它的操作数依然是一个值,但是返回的不是字符串,而是该值的 TypeScript 类型。

TypeScript 支持块级类型声明,即类型可以声明在代码块(用大括号表示)里面,并且只在当前代码块有效。

TypeScript 的类型存在兼容关系,某些类型可以兼容其他类型。

数组

TypeScript 数组有一个根本特征:所有成员的类型必须相同,但是成员数量是不确定的,可以是无限数量的成员,也可以是零成员。

数组的类型有两种写法。第一种写法是在数组成员的类型后面,加上一对方括号;第二种写法是使用 TypeScript 内置的 Array 接口。

元组

元组(tuple)是 TypeScript 特有的数据类型,JavaScript 没有单独区分这种类型。它表示成员类型可以自由设置的数组,即数组的各个成员的类型可以不同。

// 数组
let a:number[] = [1];

// 元组
let t:[number] = [1];

元组成员的类型可以添加问号后缀(?),表示该成员是可选的。

注意,问号只能用于元组的尾部成员,也就是说,所有可选成员必须在必选成员之后。

只读元组,元组也可以是只读的,不允许修改,有两种写法。

symbol 类型

Symbol 是 ES2015 新引入的一种原始类型的值。它类似于字符串,但是每一个 Symbol 值都是独一无二的,与其他任何值都不相等。

Symbol 值通过 Symbol() 函数生成。在 TypeScript 里面,Symbol 的类型使用 symbol 表示。

阮一峰 TypeScript 教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值