什么是Typescript
Typescript是一种基于Javascript的编程语言,它增强了 JavaScript 的功能,更适合多人的大项目。TypeScript 可以看成是 JavaScript 的超集,在增强功能中最主要的就是增加了类型的概念。
类型的概念
我们都知道,程序运行过程中,错误出现的越早越好。而TypeScript 的类型检查会在编译时进行类型检查,然后会将类型声明和类型相关的代码全部删除,只留下能运行的 JavaScript 代码。 一般来说,TS会在变量声明时加上类型声明,类型声明的写法即在标识符后面添加“冒号 + 类型”;如果没有加类型声明,TypeScript 也会自己推断类型,称为类型推断。后续代码如果没有按照声明的类型赋值给变量,则会出现报错。
TS的三种特殊类型
any类型
any 类型表示没有任何限制,该类型的变量可以赋予任意类型的值。变量类型一旦设为any,TypeScript 实际上会关闭这个变量的类型检查,所以应该尽量避免使用any类型。 除此之外,如果我们把any类型的变量赋值给其他变量,则会造成类型污染:即把其他变量也污染为any类型,造成不报错。
unknown类型
unknown类型可以看作是严格的any类型,主要是由于它的使用是存在限制的,虽然他和any一样也可以做任意变量的类型。
限制一
unknown类型的变量,不能直接赋值给其他类型的变量(除了any类型和unknown类型)。
限制二
不能直接调用unknown类型变量的方法和属性。
想要使用Unknown类型的变量,也需要进行类型缩小,所谓类型缩小,则是使用typeof进行类型判定,如果为true,则可以使用。
以上两种类型可以做任意变量的类型,因此TypeScript 将这两种类型称为“顶层类型”
never类型
never类型的定义是不存在任何属于“空类型”的值,就是说一个变量,不能赋给它任何值,(包括any和unknown)否则都会报错。
never类型的一个重要特点是,可以赋值给任意其他类型,注意是赋值,而不是声明。为什么可以赋值呢?因为TypeScript规定任何类型都包含了never类型,never也是TypeScript 唯一的“底层类型”。
基本类型
TS的基本类型有boolean、string、number、bigint、symbol、object、undefined和null(undefined 和 null 既可以作为值,也可以作为类型)。 需要注意的是:
- number类型和bigint类型不兼容
- 首字母大写的
Number、String、Boolean不是类型名称 - 如果没有声明类型的变量,被赋值为
undefined或null,它们的类型会被推断为any。
包装对象类型
boolean、string、number、bigint、symbol与JS相同,都有包装对象类型,即变量可以直接调用方法,实际上是在调用方法时,变量会自动转为包装对象,对象调用了方法。
字面量类型
字面量是 JavaScript 本身提供的一个准确变量。TS支持将一个字面量当成一个类型使用。
由于包装对象的存在,导致这五种原始类型的值都有包装对象和字面量两种情况。为了区分,TS规定原始类型的大写同时包含包装对象和字面量两种情况,小写只包含字面量,不包含包装对象。
const s1:String = 'hello'; // 正确
const s2:String = new String('hello'); // 正确
const s3:string = 'hello'; // 正确
const s4:string = new String('hello'); // 报错
Object 类型和object类型
Object类型中,除了undefined和null这两个值不能转为对象,其他任何值都可以赋值给Object类型。而object类型则只包含对象、数组和函数。
联合类型和交叉类型
联合类型指的是多个类型组成的一个新类型,使用符号|表示。任何一个类型只要属于A或B,就属于联合类型A|B。
交叉类型(intersection types)指的多个类型组成的一个新类型,使用符号&表示。交叉类型同时满足类型A和类型B的特征。