3. 类型详解
基本数据类型
Js类型:boolean string number object undefined null bigint symbol
TypeScript 继承了 JavaScript 的类型设计,以上8种类型可以看作 TypeScript 的基本类型。复杂类型由它们组合而成。
和Java不同,js类型的名称都是小写字母,首字母大写的Number、String、Boolean等在 JavaScript 语言中都是内置对象,而不是类型名称。
- number类型包含所有整数、浮点数、非十进制数。
- bigint 类型包含所有的大整数,与 number 类型不兼容,bigint类型赋值为整数和小数,都会报错。
- symbol 类型包含所有的 Symbol 值,Symbol()函数的返回值就是 symbol 类型。
- undefined 和 null 是两种独立类型,它们各自都只有一个值。
- 大写的Object类型代表 JavaScript 语言里面的广义对象。所有可以转成对象的值,都是Object类型,这囊括了几乎所有的值。除了undefined和null
- 小写的object类型代表 JavaScript 里面的狭义对象,即可以用字面量表示的对象,只包含对象、数组和函数,不包括原始类型的值。
- 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命令的参数也不能是类型。
评论