前言
在上一篇文章TypeScript 学习笔记(一):初识TS中,我们初步简单的了解了TS
是什么,今天我们来学习一下TS
的基础类型有哪些。
基本类型
在JS
中,值被分成8种类型。
- boolean
- string
- number
- bigint
- symbol
- object
- undefined
- null
TS
继承了JS
的类型设计,以上8种类型可以看作TS
的基本类型。这8种基本类型是TS
类型系统的基础,复杂类型由它们组合而成。
以下是它们的简单介绍。
boolean 类型
boolean
类型只包含true
和false
两个布尔值。
TS
const x:boolean = true;
const y:boolean = false;
上面示例中,变量x
和y
就属于boolean
类型。
string 类型
string
类型包含所有字符串。
TS
const x:string = 'hello';
const y:string = `${x} world`;
上面示例中,普通字符串和模板字符串都属于string
类型。
number 类型
number
类型包含所有整数和浮点数。
TS
const x:number = 123;
const y:number = 3.14;
上面示例中,整数、浮点数都属于number
类型。
bigint 类型
bigint
类型包含所有的大整数。
TS
const x:bigint = 123n;
const y:bigint = 0xffffn;
上面示例中,变量x
和y
就属于bigint
类型。
注意:bigint
与number
类型不兼容。
TS
const x:bigint = 123; // 报错
const y:bigint = 3.14; // 报错
上面示例中,bigint
类型赋值为整数和小数,都会报错。
symbol 类型
symbol 类型包含所有的 Symbol 值。
TS
const x:symbol = Symbol();
上面示例中,Symbol()
函数的返回值就是 symbol 类型。
object 类型
根据JS
的设计,object
类型包含了所有对象、数组和函数。
ini
const x:object = { foo: 123 };
const y:object = [1, 2, 3];
const z:object = (n:number) => n + 1;
上面示例中,对象、数组、函数都属于object
类型。
undefined 类型,null 类型
undefined
和null
是两种独立类型,它们各自都只有一个值。
- undefined 类型只包含一个值
undefined
,表示未定义(即还未给出定义,以后可能会有定义)。
TS
let x:undefined = undefined;
上面示例中,变量x
就属于 undefined 类型。两个undefined
里面,第一个是类型,第二个是值。
- null 类型也只包含一个值
null
,表示为空(即此处没有值)。
TS
const x:null = null;
上面示例中,变量x
就属于 null 类型。
注意,如果没有声明类型的变量,被赋值为undefined
或null
,在关闭编译设置noImplicitAny
和strictNullChecks
时,它们的类型会被推断为any
。
TS
// 关闭 noImplicitAny 和 strictNullChecks
let a = undefined; // any
const b = undefined; // any
let c = null; // any
const d = null; // any
TS
// 打开编译设置 strictNullChecks
let a = undefined; // undefined
const b = undefined; // undefined
let c = null; // null
const d = null; // null
Object 类型与 object 类型的区别
TS
的对象类型也有大写Object
和小写object
两种。
Object 类型
大写的Object
类型代表 JavaScript 语言里面的广义对象。所有可以转成对象的值,都是Object
类型,这囊括了几乎所有的值。
TS
let obj:Object;
obj = true;
obj = 'hi';
obj = 1;
obj = { foo: 123 };
obj = [1, 2];
obj = (a:number) => a + 1;
除了undefined
和null
这两个值。
TS
let obj:Object;
obj = undefined; // 报错
obj = null; // 报错
另外,空对象{}
是Object
类型的简写形式,所以使用Object
时常常用空对象代替。
TS
let obj:{};
obj = true;
obj = 'hi';
obj = 1;
obj = { foo: 123 };
obj = [1, 2];
obj = (a:number) => a + 1;
上面示例中,变量obj
的类型是空对象{}
,就代表Object
类型。
object 类型
小写的object
类型代表 JavaScript 里面的狭义对象,即可以用字面量表示的对象,只包含对象、数组和函数,不包括原始类型的值。
TS
let obj:object;
obj = { foo: 123 };
obj = [1, 2];
obj = (a:number) => a + 1;
obj = true; // 报错
obj = 'hi'; // 报错
obj = 1; // 报错
值类型
TS
规定,单个值也是一种类型,称为"值类型"。
当类型是值类型时,导只能赋值为这个值,赋值为其他值就会报错。
TS
let x:'hello';
x = 'hello'; // 正确
x = 'world'; // 报错
推断类型时,遇到const
命令声明的变量,如果代码里面没有注明类型,就会推断该变量是值类型。
TS
// x 的类型是 "https"
const x = 'https';
// y 的类型是 string
const y:string = 'https';
当const
命令声明的变量,赋值为对象,并不会推断为值类型。
TS
// x 的类型是 { foo: number }
const x = { foo: 1 };
联合类型
联合类型(union types)指的是多个类型组成的一个新类型,使用符号|
表示。 联合类型A|B
表示,任何一个类型只要属于A
或B
,就属于联合类型A|B
。
TS
let x:string|number;
x = 123; // 正确
x = 'abc'; // 正确
联合类型可以与值类型相结合,表示一个变量的值有若干种可能。
TS
let setting:true|false;
let gender:'male'|'female';
上面的示例都是由值类型组成的联合类型,非常清晰地表达了变量的取值范围。其中,true|false
其实就是布尔类型boolean
。
前面提到,打开编译选项strictNullChecks
后,其他类型的变量不能赋值为undefined
或null
。这时,如果某个变量确实可能包含空值,就可以采用联合类型的写法。
TS
let name:string|null;
name = 'John';
name = null;