在 TypeScript
中,提供了以下基本数据类型:
- 布尔类型(
boolean
) - 数字类型(
number
) - 字符串类型(
string
) - 数组类型(
array
) - 元祖类型(
tuple
) - 枚举类型(
enum
) - 任意值类型(
any
) null
和undefined
void
类型never
类型
其中元祖、枚举、任意值、void
类型和never
类型是TypeScript
有别于 JavaScript
的特有类型。
在TypeScript
中声明变量,需要加上类型声明,如boolean
或string
等。通过静态类型约束,在编译时执行类型检查,这样可以避免一些类型混用的低级错误
1.布尔类型
布尔类型是最简单的数据类型,只有true
和false
两种值。
下面定义了一个布尔类型的变量flag
,并赋值为true
。由于flag
被初始化为布尔类型,如果再赋值为非boolean
的其他类型值,编译时会抛出错误。
let flag : boolean = true;
flag = 1; //报错,不能把数字类型的值赋给布尔类型的变量。
2.数字类型
在TypeScript
中,数字都是浮点型。
TypeScript
同时支持二进制、八进制、十进制和十六进制字面量,示例代码如下:
let binaryLiteral : number = 0b1010; // 二进制
let octalLiteral : number = 0o744; // 八进制
let decLiteral : number = 6; // 十进制
let hexLiteral : number = 0xf00d // 十六进制
3.字符串类型
TypeScript
支持使用单引号(‘)或双引号(“)来表示字符串类型。除此之外,还支持使用模版字符串反引号( ` )来定义多行文本和内嵌表达式。使用 ${expr}
的形式嵌入变量或表达式,在处理拼接字符串的时候很有用,示例代码如下:
let name : string = "Angular";
let years : number = 5;
let words : string = `你好,今年是 ${ name } 发布 ${ years + 1 } 周年`;
4.数组类型
TypeScript
数组的操作类似于JavaScript
中数组的操作,TypeScript
建议开发者最好只为数组元素赋一种类型的值。
TypeScript
有两种数组定义方式,示例代码如下:
// 在元素类型后面接上 []
let arr : number[] = [1,2];
// 或者使用数字泛型
let arr : Array<number> = [1,2];
5.元祖类型
元祖类型用来表示已知元素数量和类型的数组,各元素的类型不必相同。
下面定义了一对值分别为字符串和数字类型的元祖,示例代码如下:
let x : [string,number];
x = ['Angular',25]; // 运行正常
x = [10,'Angular']; // 报错
console.log(x[0]); // 输出 Angular
6.枚举类型
枚举是一个可被命名的整形常数的集合,枚举类型为集合成员赋予有意义的名称,增强可读性。
示例代码如下:
enum Color {Red,Green,Blue};
let c : Color = Color.Blue;
console.log(c); // 输出: 2
枚举默认下标为 0 ,可以手动修改默认下标值,示例代码如下:
enum Color {Red = 2,Green,Blue = 6};
let c : Color = Color.Green;
console.log(c); // 输出: 3
7.任意值类型
任意值是TypeScript
针对编程时类型不明确的变量使用的一种数据类型,它常用于以下三种情况。
- 变量的值会动态变化,比如来自用户的输入或者第三方代码库,任意值类型可以让这些变量跳过编译阶段的类型检查,示例代码如下:
let x : any = 1; //数字类型
x = "I am a string"; // 字符串类型
x = false; // 布尔类型
- 改写现有代码时,任意值允许在编译时可选择地包含或者移除类型检查,示例代码如下:
let x : any = 4;
x.ifItExists(); //正确,ifItExists方法在运行时可能存在,但是这里并不检查
x.toFixed(); //正确
- 定义存储各种类型数据的数组时,示例代码如下:
let arrayList : any[] = [1,false,"fine"];
arrayList[1] = 100;
8.null
和undefined
默认情况下,null
和undefined
是其他类型的子类型,可以赋值给其他类型,如数字类型等,此时赋值后的类型会变成null
或undefined
,致力于类型校验的TypeScript
设计者们显然不希望这种类型变化给开发者带来额外的困扰。在TypeScript
中启用严格的空校验(–strictNullChecks)特性,就可以使得null
和undefined
只能被赋值给void
或本身对应的类型,示例代码如下:
// 启用--strictNullChecks
let x : number;
x = 1; //运行正确
x = undefined; //运行错误
x = null; //运行错误
上面例子中变量x
只能是数字类型,如果一个类型可能出现null
或者undefined
,可以用|
来支持多种类型,示例代码如下:
// 启用--strictNullChecks
let x : number;
let y : number | undefined;
let z : number | undefined | null;
x = 1; //运行正确
y = 1; //运行正确
z = 1; //运行正确
x = undefined; //运行错误
y = undefined; //运行正确
z = undefined; //运行正确
x = null; //运行错误
y = null; //运行错误
z = null; //运行正确
x = y; //运行错误
x = z; //运行错误
y = x; //运行正确
y = z; //运行错误
z = x; //运行正确
z = y; //运行正确
上面的例子中变量y
允许被赋予数字类型或者undefined
类型的数据值,而变量z
还额外支持null
。TypeScript
官方建议在编码时,都启用--strictNullChecks
特性,这样有利于编写更健壮的代码。
9.void
类型
在TypeScript
中,使用void
表示没有任何类型。例如一个函数没有返回值时,意味着返回值类型是void
。
示例代码如下:
function hello() : void {
alert("Hello Angular");
}
对于可忽略返回值的回调函数来说,使用void类型会比任意值类型更安全一些。
示例代码如下:
function func(foo:()=>void) {
let f = foo(); //使用函数foo的返回值
f.doSth(); //报错,void类型不存在doSth()方法,此时换成任意值类型则不报错
}
10.never
类型
never
是其他类型(包括null
和undefined
)的子类型,代表从不会出现的值。这意味着声明为never
类型的变量只能被never
类型所赋值,在函数中它通常表现为抛出异常或者无法执行到终止点(例如无限循环)。
示例代码如下:
let x : never;
let y : number;
// 运行错误,数字类型不能转为never类型
x = 123;
// 运行正确,never类型可以赋值给never类型
x = (()=>{throw new Error('exception occur')})();
// 运行正确,never类型可以赋值给number类型
y = (()=>{throw new Error('exception occur')})();
// 返回值为never的函数可以是抛出异常的情况
function error(message : string) : never {
throw new Error(message);
}
// 返回值为never的函数可以是无法被执行到终止点的情况
function loop():never {
while(true) {
}
}