类型系统基础

TypeScript 的核心优势之一就是其强大的类型系统。本章节将介绍最常用的基础类型以及它们的使用方式。

原始类型

TypeScript 支持 JavaScript 中的所有原始类型:

let num: number = 42;
let str: string = "Hello, TypeScript!";
let isActive: boolean = true;
let u: undefined = undefined;
let n: null = null;
let sym: symbol = Symbol("unique");

注意:nullundefined 默认在非严格模式下是所有类型的子类型。

数组与元组

数组(Array)

定义一个元素类型为 number 的数组:

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

或使用泛型写法:

let strings: Array<string> = ["a", "b", "c"];

元组(Tuple)

元组用于定义已知长度和类型顺序的数组:

let person: [string, number] = ["Alice", 30];

枚举(Enum)

枚举用于定义一组命名常量:

enum Direction {
  Up,
  Down,
  Left,
  Right,
}

let dir: Direction = Direction.Up;

也可以使用字符串枚举:

enum Status {
  Success = "success",
  Failure = "failure",
}

任意类型与类型推断

any

any 表示放弃类型检查,等同于 JavaScript 的动态类型:

let value: any = 123;
value = "string";
value = true;

不推荐在实际项目中过多使用。

unknown

unknown 表示类型未知,但更安全(使用前必须先做类型判断):

let input: unknown = "hello";
if (typeof input === "string") {
  console.log(input.toUpperCase());
}

类型推断

TypeScript 会自动根据初始值推断变量类型:

let count = 100; // 推断为 number

类型别名与交叉类型

类型别名(type)

可以使用 type 为复杂类型取别名,简化书写:

type Point = {
  x: number;
  y: number;
};

let p: Point = { x: 10, y: 20 };

交叉类型(&)

交叉类型将多个类型合并为一个:

type A = { name: string };
type B = { age: number };
type C = A & B;

let person: C = { name: "Tom", age: 25 };