3. 类型详解

TS系列140427 阅读0

基本数据类型

Js类型:boolean string number object undefined null bigint symbol

TypeScript 继承了 JavaScript 的类型设计,以上8种类型可以看作 TypeScript 的基本类型。复杂类型由它们组合而成。

和Java不同,js类型的名称都是小写字母,首字母大写的Number、String、Boolean等在 JavaScript 语言中都是内置对象,而不是类型名称。

  1. number类型包含所有整数、浮点数、非十进制数。
  2. bigint 类型包含所有的大整数,与 number 类型不兼容,bigint类型赋值为整数和小数,都会报错。
  3. symbol 类型包含所有的 Symbol 值,Symbol()函数的返回值就是 symbol 类型。
  4. undefined 和 null 是两种独立类型,它们各自都只有一个值。
  5. 大写的Object类型代表 JavaScript 语言里面的广义对象。所有可以转成对象的值,都是Object类型,这囊括了几乎所有的值。除了undefined和null
  6. 小写的object类型代表 JavaScript 里面的狭义对象,即可以用字面量表示的对象,只包含对象、数组和函数,不包括原始类型的值。
  7. undefined和null既是值,又是类型。作为值,它们有一个特殊的地方:任何其他类型的变量都可以赋值为undefined或null。

值类型

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

let x:'hello';

这样,x就只能赋值为hello。TypeScript 推断类型时,遇到const命令声明的变量,如果代码里面没有注明类型,就会推断该变量是值类型。(const命令声明的变量,如果赋值为对象,并不会推断为值类型。)

联合类型

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

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

let x:string|number;

联合类型可以与值类型相结合,表示一个变量的值有若干种可能。

如果某个变量确实可能包含空值,就可以采用联合类型的写法。let name:string|null;

交叉类型

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

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

let x:number&string;

上面示例中,变量x同时是数值和字符串,这当然是不可能的,所以 TypeScript 会认为x的类型实际是never。

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

type A = { foo: number };

type B = A & { bar: number };

type 命令

type命令用来定义一个类型的别名。别名不允许重名。

type Age = number;

let age:Age = 55;

type命令属于类型相关的代码,编译成 JavaScript 的时候,会被全部删除。

typeof 运算符

avaScript 里面,typeof运算符只可能返回八种结果,而且都是字符串。TypeScript 将typeof运算符移植到了类型运算,它的操作数依然是一个值,但是返回的不是字符串,而是该值的 TypeScript 类型。

const a = { x: 0 };

type T0 = typeof a; // { x: number }
type T1 = typeof a.x; // number

Ts的typeof 的参数只能是标识符,不能是表达式,否则会与ts的tyoeof混淆。ts的typeof会在编译后删除。

另外,typeof命令的参数也不能是类型。

评论

发表评论