JS本身是弱类型语言,对于变量类型不做限制,同一个变量可以赋值任何类型的数据。TypeScript 则取消了这种随心所欲,要求数据类型必须和声明的相同。
布尔/字符串/数值
let isDone: boolean = false;
let myname: string = "lyra";let num: number = 9;
数组
数组有两种形式
// 第一种(数据类型[])
let list: number[] = [1,2,3];
// 第二种(数组泛型: Array<数据类型>)
let list: Array<number> = [1,2,3];
元组Tuple(狭义的数组)
元组其实也是数组,但是它已知数组的长度和每个元素的类型。
let list: [string, number]; // declare a tuple type
console.log(list[1].substr(1)); // ❌Error: number does not have ‘substr’
对于超过数组范围,如list[2]等,会使用联合类型,联合类型是高级类型。
枚举类型(狭义的数组)
枚举类型本质上也是数组,但是它已知数组长度且默认元素的值是数组的索引,并且给数组的每个元素赋予了一个语义化的变量名。
enum Color {Red, Green, Blue};
let c:Color = Color.Red; // c默认是0,依次递增1,2,3...
可以手动给变量赋值, 可以是数值,也可以是其他值
// 数值
enum Color {Red=1, Green=4, Blue};
let c: Color = Color.Blue; // 5
// 字符串
enum Color {Red="red", Green="green", Blue="blue"};
let c: Color = Color.Blue; // "blue"
还可以通过枚举的数值类型的值查找对应的位置的变量名。
enum Color {Red=3, Green, Blue};
let colorName: string = Color[4]; // "Green"
// 如果将枚举值设为字符串,则不能查找变量名
any
any类型对变量类型不做限制,类型检查器不对其进行校验,可以接受任意类型的值。
let a: any = 5;
a = "hello"; // ✅
any类型会将数据类型默认是Object,可以对其调用任何方法,类型检查器不会报错!
let notSure: any = 4;
notSure.ifItExists(); // okay, ifItExists might exist at runtime
void
和any相反,没有任何类型。当函数无返回值时,其返回值类型是void。
void类型可以赋值undefined和null。
function fn(): void {
// todo
}
Null和Undefined
null和undefined默认是所有类型的子类型。
let num: number = 5;
num = null;
如果tsConfig中设置了--strictNullChecks为true。null和undefined只能赋值给void。
此时上面的示例
let num: number = 5;
num = null; // ❌Error:type "null" is not assignable to type "number"
Never
never类型主要用于以下场景:
1)函数必须存在无法到达的终点
function initiateLoop(): never {
while(true){}
}
2)总是抛出异常
function error(message: string): never {
throw new Error()
}
function fail() {
return error("failed"); // 推断返回异常
}
never默认是所有类型的子类型。
Object
object类型是除了string,number,boolean,null,undefined,symbol之外的类型。
declare function create(o: object | null);
create({prop: 0});
create([]);
类型断言
类型断言类似强制类型类型转换,告诉编译器不需要检查,我一定是对的。
有两种类型断言:
1)尖括号(<>)
let someValue:any = "hello";let strLen: number = (<string>someValue).length;
2)as
let someValue:any = "hello";let strLen: number = (someValue as string).length;
但是在JSX语法中,只能使用as.