本文的价值在于,基于官方文档,作一种更为通俗和易于理解的解读,使得读者能够用最小的时间和精力成本,把握TypeScript基础类型的精髓。
假设作为开发者的你,已经下了很多决心来学习TypeScript,可是你并没有恒心学下去,并且你感觉抓不住重点,不太喜欢查阅散乱的文档。譬如,一般而言,学习都会从基础类型开始,每当你查看官方文档的时候,你都没有耐心读下去。那么你可以试试看看这篇文章——作者的总结。
第一章 你知道TypeScript分为哪些基础类型吗
我们可以把TypeScript的基础类型分为两类:
一类是在JavaScript中有的,对此我们已经司空见惯:
布尔值、数字、字符串、null、undefined、Object、数组等,
另一类则是TypeScript中才有的:
元组、枚举、Any、Void、Never。
第二章 我怎么记忆这些类型
事实上,并不需要特别的去一个个的记忆,比较推荐按照分类的方式来理解性记忆。
(一)首先,我们可以分出一类,这一类的基础类型,声明变量时只需要在变量后面加上冒号和类型即可,如下:
let isDone: boolean = false;
- 数字:
let decLiteral: number = 6;
3.字符串:
let name: string = "bob";
4.Undefined :
let u: undefined = undefined;
5.Null:
let n: null = null;
6.Object:
let a: object = { name: "jack" };
(二)第二类是稍微复杂点的:
let list: number[] = [1, 2, 3];
数组的声明,首先需要在变量list后面加上冒号和[],以表明是数组,还需要在[]前面加上表示每一个数组成员的类型,如number;
还有另外一种表示方法:
let list: Array<number> = [1, 2, 3];
即在变量list的后面加上冒号和Array,以表明是数组,然后在Array的后面加上尖括号,里面写死每个数组成员的类型number。
你可能会有疑问,按照JavaScript的惯性思维,如果数组成员的类型并不相同,又该如何表示呢?别急,可以在使用any,见后面。
- 元组Tuple:
let x: [string, number];
即在变量list后面加上冒号和[],在[]里面加上元组成员的类型,如string、number;
(三)TypeScript独有的:
- 枚举:
enum Color {Red, Green, Blue}
let c: Color = Color.Green;
Color这个类型我们需要先定义,enum Color表明我们定义了一个枚举类型叫做Color,这个类型的变量取值只能是Red、Green、Blue之一。
你可能会问,那Color.Red、Color.Green、Green.Blue的取值是多少呢,事实上,默认值将分别是0、1、2,即有点像数组的索引值。
如果,你不想要这样的值,只需要再定义枚举时指定即可:
enum Color {
Red = "red",
Green = "green",
Blue = "blue",
}
下面的let c一句表明,c将是枚举类型Color,即c的取值只能是 Color.Red、Color.Green、Green.Blue之一,也就是说必须是这样写,哪怕值一样也不行:
let c: Color = "green";
这样的写法就不行,而应改成
let c: Color = Color.Green;
另外,枚举成员的类型不是都为索引时,每一个都必须指定值:
enum Color {
Red = '1',
Green,
Blue = '2',
}
// 错误,不是都为索引值,这时green必须指定值
enum Color {
Red = 0,
Green = "2",
Blue,
}
// 错误,不是都为索引值,这时blue必须指定值
- Any:
let notSure: any = 4;
let list: any[] = [1, true, "free"];
即any类型的变量可以被赋值为任意值。
3.Void:
let unusable: void = undefined;
Void类型的变量只能为它赋予undefined
和null。
function warnUser(): void {
console.log("This is my warning message");
}
当一个函数没有返回值时,可将其返回值类型设为 void。
4.Never:
// 返回never的函数必须存在无法达到的终点
function error(message: string): never {
throw new Error(message);
}
// 推断的返回值类型为never
function fail() {
return error("Something failed");
}
// 返回never的函数必须存在无法达到的终点
function infiniteLoop(): never {
while (true) {
}
}
never
类型是那些总是会抛出异常或根本就不会有返回值的函数表达式或箭头函数表达式的返回值类型; 变量也可能是 never
类型,当它们被永不为真的类型保护所约束时。
第三章 什么是类型断言
断言解决的问题是,传递给我们的值的类型可能是不确定的,可是我们需要某一种确定类型的值。
let someValue: number | string = "1234";
// 尖括号语法
let strLength: number = (<string>someValue).length;
// as语法
let strLength: number = (someValue as string).length;
上面的情况,我们希望取string类型的someValue的length,可是someValue实际上是可以取number的,number没有length属性,因此我们加上了断言,要求传入的someValue必须是string类型,即我们自己要确保someValue的实际取值是string类型。
全文完。