当前位置:  首页>> 技术小册>> TypeScript 全面进阶指南

第三章:TypeScript基本类型与语法

在TypeScript的世界中,理解其基本类型和语法是踏入这门强大语言门槛的第一步。TypeScript作为JavaScript的超集,不仅继承了JavaScript的所有特性,还通过添加类型系统和编译时类型检查,极大地提升了代码的可读性、可维护性和开发效率。本章将深入解析TypeScript的基本类型与语法,帮助读者构建坚实的TypeScript基础。

3.1 引言

TypeScript通过引入静态类型系统,允许开发者在编写代码时指定变量、函数参数、函数返回值等的类型。这有助于在编译阶段捕获许多潜在的错误,比如类型不匹配、未定义的变量等,从而提高代码质量。此外,TypeScript的类型系统还支持接口(Interfaces)、泛型(Generics)、枚举(Enums)等高级特性,这些将在后续章节中详细介绍。

3.2 基本类型

TypeScript支持多种基本类型,包括布尔类型(Boolean)、数字类型(Number)、字符串类型(String)、数组类型(Array)、元组类型(Tuple)、枚举类型(Enum)、任意类型(Any)、空类型(Void)、Null 和 Undefined、Never 以及 Object 类型等。

3.2.1 布尔类型(Boolean)

布尔类型是最基础的数据类型之一,表示逻辑上的真(true)或假(false)。

  1. let isDone: boolean = false;
3.2.2 数字类型(Number)

TypeScript中的数字类型用于表示任何形式的数值,包括整数和浮点数。

  1. let age: number = 30;
  2. let pi: number = 3.14;
3.2.3 字符串类型(String)

字符串类型用于表示文本数据,可以使用单引号(’)、双引号(”)或反引号(`)定义。

  1. let name: string = 'Alice';
  2. let greeting: string = `Hello, ${name}!`;
3.2.4 数组类型(Array)

数组类型用于表示一组值的有序集合。在TypeScript中,可以通过在元素类型后面加上[]来定义数组类型。

  1. let numbers: number[] = [1, 2, 3, 4, 5];

或者使用泛型数组类型定义:

  1. let strings: Array<string> = ['hello', 'world'];
3.2.5 元组类型(Tuple)

元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。

  1. let user: [string, number, boolean] = ['Alice', 30, false];
3.2.6 枚举类型(Enum)

枚举类型是一种特殊的类,用于表示一组命名的常量。

  1. enum Color {Red, Green, Blue}
  2. let c: Color = Color.Green;

还可以为枚举成员手动指定值。

3.2.7 任意类型(Any)

当你事先不知道一个值的类型时,可以使用any类型来标记这个变量。any类型基本上是TypeScript中的顶级类型,可以赋值给任何类型。

  1. let notSure: any = 4;
  2. notSure = "maybe a string instead";
  3. notSure = false; // okay, definitely a boolean
3.2.8 空类型(Void)

void类型通常用于表示没有任何类型值的情况,常用于函数的返回值类型。

  1. function warnUser(): void {
  2. console.log("This is a warning");
  3. }
3.2.9 Null 和 Undefined

在TypeScript中,nullundefined有各自的类型,分别称为nullundefined。默认情况下,所有类型都是nullundefined的子类型。但可以通过设置--strictNullChecks编译选项来启用严格的空检查。

3.2.10 Never

never类型表示的是那些永不存在的值的类型。例如,函数抛出异常或根本不会有返回值时,其返回类型就是never

  1. function error(message: string): never {
  2. throw new Error(message);
  3. }
3.2.11 Object

object类型表示非原始类型(即除numberstringbooleansymbolnullundefined之外的类型)。

  1. let obj: object = {name: 'Alice', age: 30};

3.3 类型断言

当你知道某个值的类型,但TypeScript编译器无法自动推断出来时,可以使用类型断言来明确告诉编译器这个值的类型。

  1. let someValue: any = "this is a string";
  2. let strLength: number = (someValue as string).length;

或者使用尖括号语法(但在JSX中应避免使用):

  1. let strLength: number = (<string>someValue).length;

3.4 联合类型与交叉类型

3.4.1 联合类型(Union Types)

联合类型表示一个值可以是几种类型之一。

  1. let value: string | number;
  2. value = "hello";
  3. value = 42;
3.4.2 交叉类型(Intersection Types)

交叉类型是将多个类型合并为一个类型,新类型将具有所有类型的特性。

  1. interface Admin {
  2. admin: boolean;
  3. }
  4. interface User {
  5. name: string;
  6. id: number;
  7. }
  8. type AdminUser = Admin & User;
  9. let adminUser: AdminUser = {
  10. admin: true,
  11. name: 'Alice',
  12. id: 1,
  13. };

3.5 类型别名

类型别名(Type Aliases)是一种为类型起一个新名字的方式,有助于简化复杂类型的定义。

  1. type StringOrNumber = string | number;
  2. let value: StringOrNumber = "hello";
  3. value = 42;

3.6 类型守卫与类型断言的区别

类型守卫(Type Guards)和类型断言都用于处理联合类型,但它们在用途和机制上有所不同。类型守卫是一种表达式,该表达式在执行时会返回一个布尔值,用于在运行时检查某个联合类型的变量是否属于特定的子类型。而类型断言则是一种告诉编译器“我知道我在做什么”的方式,它不会进行任何的运行时检查。

3.7 小结

本章详细介绍了TypeScript的基本类型和语法,包括布尔类型、数字类型、字符串类型、数组类型、元组类型、枚举类型、任意类型、空类型、Null 和 Undefined、Never、Object类型等。此外,还探讨了类型断言、联合类型与交叉类型、类型别名等高级特性。通过本章的学习,读者应能掌握TypeScript的基本类型系统和语法规则,为后续深入学习TypeScript打下坚实基础。

在后续章节中,我们将进一步探索TypeScript的接口、类、泛型、模块等高级特性,帮助读者全面掌握TypeScript的编程技能。


该分类下的相关小册推荐: