在 TypeScript
中,提供了以下基本数据类型:
boolean
)number
)string
)array
)tuple
)enum
)any
)null
和undefined
void
类型never
类型其中元祖、枚举、任意值、void
类型和never
类型是TypeScript
有别于 JavaScript
的特有类型。
在TypeScript
中声明变量,需要加上类型声明,如boolean
或string
等。通过静态类型约束,在编译时执行类型检查,这样可以避免一些类型混用的低级错误
布尔类型是最简单的数据类型,只有true
和false
两种值。
下面定义了一个布尔类型的变量flag
,并赋值为true
。由于flag
被初始化为布尔类型,如果再赋值为非boolean
的其他类型值,编译时会抛出错误。
let flag : boolean = true;
flag = 1; //报错,不能把数字类型的值赋给布尔类型的变量。
在TypeScript
中,数字都是浮点型。
TypeScript
同时支持二进制、八进制、十进制和十六进制字面量,示例代码如下:
let binaryLiteral : number = 0b1010; // 二进制
let octalLiteral : number = 0o744; // 八进制
let decLiteral : number = 6; // 十进制
let hexLiteral : number = 0xf00d // 十六进制
TypeScript
支持使用单引号(‘)或双引号(“)来表示字符串类型。除此之外,还支持使用模版字符串反引号( ` )来定义多行文本和内嵌表达式。使用 ${expr}
的形式嵌入变量或表达式,在处理拼接字符串的时候很有用,示例代码如下:
let name : string = "Angular";
let years : number = 5;
let words : string = `你好,今年是 ${ name } 发布 ${ years + 1 } 周年`;
TypeScript
数组的操作类似于JavaScript
中数组的操作,TypeScript
建议开发者最好只为数组元素赋一种类型的值。
TypeScript
有两种数组定义方式,示例代码如下:
// 在元素类型后面接上 []
let arr : number[] = [1,2];
// 或者使用数字泛型
let arr : Array = [1,2];
元祖类型用来表示已知元素数量和类型的数组,各元素的类型不必相同。
下面定义了一对值分别为字符串和数字类型的元祖,示例代码如下:
let x : [string,number];
x = ['Angular',25]; // 运行正常
x = [10,'Angular']; // 报错
console.log(x[0]); // 输出 Angular
枚举是一个可被命名的整形常数的集合,枚举类型为集合成员赋予有意义的名称,增强可读性。
示例代码如下:
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
任意值是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;
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
特性,这样有利于编写更健壮的代码。
void
类型在TypeScript
中,使用void
表示没有任何类型。例如一个函数没有返回值时,意味着返回值类型是void
。
示例代码如下:
function hello() : void {
alert("Hello Angular");
}
对于可忽略返回值的回调函数来说,使用void类型会比任意值类型更安全一些。
示例代码如下:
function func(foo:()=>void) {
let f = foo(); //使用函数foo的返回值
f.doSth(); //报错,void类型不存在doSth()方法,此时换成任意值类型则不报错
}
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) {
}
}