数字类型
数字类型关键字为 number ,所有数字都是浮点数
let intLiteral: number = 6;
let floatLiteral: number = 3.1415;
布尔类型
布尔类型关键字为 boolean,仅有两个值 true 和 false
let isDone: boolean = false;
isDone = true;
字符串类型
字符串类型关键字为 string
let name: string = "bob";
符号类型
符号类型关键字为 symbol
let sym: symbol = Symbol();
let sym1: symbol = Symbol('test');
Void类型
Void类型关键字为 void , Void类型 表示没有类型或空类型。
当一个函数没有返回值时,你可以显式指定返回值为 void;如果不显式指定,会被自动推导为 Void类型
// 显式指定返回类型为 void
function hi(): void { /**函数体为空**/ }
// 和上面等价,返回值会被自动推导为 void
function hi() { /**函数体为空**/ }
显式声明一个值为 Void类型 是合法的,但没什么意义,因为你只能为它赋值undefined 或 null
let x: void = undefined;
// 仅在 strictNullChecks 编译选项关闭时合法
let y: void = null;
当把
null赋值给 Void类型 的时候,仅在 strictNullChecks 编译选项关闭时才合法
Null类型 和 Undefined类型
- Null类型关键字为
null - Undefined类型关键字为
undefined
null和undefined既可以是类型关键字,也可以是值,参靠下面示例代码
Null类型和Undefined类型的类型表现和编译选项 strictNullChecks 有关,上面已经提到这个选项。编译相关的教程后面会有专门的介绍,此处不做讲解。
strictNullChecks 选项打开
null只能赋值给 Null类型undefined只能赋值给 Undefined类型 和 Void类型
// 合法
let n: null = null;
let u: undefined = undefined;
let v: void = undefined;
// 不合法
let v: void = null;
strictNullChecks 选项关闭
null和undefined可以赋值给任意类型
// 合法
let v1: undefined = null;
let v2: void = undefined;
let v3: null = undefined;
let x: number = null;
let y: string = undefined;
Never类型
Never类型关键字为 never。Never类型代表不可能存在的类型,Never类型常常伴随着错误和异常出现(因为错误和异常可以提前终止,让值无法到达):
// 抛出异常,永远无法返回
function error(message: string): never {
throw new Error(message);
}
// 死循环,永远无法返回
function infiniteLoop(): never {
while (true) {
}
}
// 声明交叉类型变量:既是布尔类型也是数字类型
let n: boolean & number;
// 以下赋值皆错误,不可能存在一个值既是布尔类型也是数字类型
n = 1; // error TS2322: Type '1' is not assignable to type 'never'
n = null; // error TS2322: Type 'null' is not assignable to type 'never'
n = false; // error TS2322: Type 'false' is not assignable to type 'never'
上面示例中的交叉类型变量赋值,根据错误提示可知,会被编译器推导为 never 类型:
// 声明不可能存在的交叉类型
let n: boolean & number;
// 等价于
let n: never;
任意值类型
任意值的类型关键字为 any,任意值就是可以被当做任意类型使用的值。任意值具有动态类型特性:
// 声明为任意类型
let notSure: any = 4;
// 赋值为字符串类型
notSure = "hello world";
// 赋值为布尔类型
notSure = false;
一个值,如果满足以下任何一个条件,会被判定为任意类型:
1、显式指定类型 any
// 显式指定变量类型,x为any
let x: any;
// 显式指定变量类型,y为any
let y: any = 10;
2、未显式指定类型,且没有初始化或默认值
// 未指定类型,且未初始化。x为any
let x;
// 未指定类型,但初始化了。y被自动推导为number
let y = 10;
// 未指定类型,且没有默认值。参数x为any
function f(x) {
console.log(x);
}
尽量不要使用any类型,any类型表现上跟JavaScript的类型一样弱。TypeScript最大的优势在于类型化带来的强约束作用,他可以让你更早的发现错误,并带来更高的可维护性