# 类型系统基础

URL: https://caijiao.org/ts/part1/type-system
Source: docs/ts/part1/type-system.md
Description: TypeScript 中的基本类型系统，包括原始类型、数组与元组、枚举、any 与 unknown 类型、类型别名与交叉类型等内容。

[TypeScript](/ts/) 的核心优势之一就是其强大的类型系统。本章节将介绍最常用的基础类型以及它们的使用方式。

## 原始类型

TypeScript 支持 JavaScript 中的所有原始类型：

```ts
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");
```

注意：`null` 和 `undefined` 默认在非严格模式下是所有类型的子类型。

## 数组与元组

### 数组（Array）

定义一个元素类型为 `number` 的数组：

```ts
let numbers: number[] = [1, 2, 3];
```

或使用泛型写法：

```ts
let strings: Array<string> = ["a", "b", "c"];
```

### 元组（Tuple）

元组用于定义**已知长度和类型顺序**的数组：

```ts
let person: [string, number] = ["Alice", 30];
```

## 枚举（Enum）

枚举用于定义一组命名常量：

```ts
enum Direction {
  Up,
  Down,
  Left,
  Right,
}

let dir: Direction = Direction.Up;
```

也可以使用字符串枚举：

```ts
enum Status {
  Success = "success",
  Failure = "failure",
}
```

## 任意类型与类型推断

### `any`

`any` 表示**放弃类型检查**，等同于 JavaScript 的动态类型：

```ts
let value: any = 123;
value = "string";
value = true;
```

不推荐在实际项目中过多使用。

### `unknown`

`unknown` 表示**类型未知**，但更安全（使用前必须先做类型判断）：

```ts
let input: unknown = "hello";
if (typeof input === "string") {
  console.log(input.toUpperCase());
}
```

### 类型推断

TypeScript 会自动根据初始值推断变量类型：

```ts
let count = 100; // 推断为 number
```

## 类型别名与交叉类型

### 类型别名（type）

可以使用 `type` 为复杂类型取别名，简化书写：

```ts
type Point = {
  x: number;
  y: number;
};

let p: Point = { x: 10, y: 20 };
```

### 交叉类型（&）

交叉类型将多个类型合并为一个：

```ts
type A = { name: string };
type B = { age: number };
type C = A & B;

let person: C = { name: "Tom", age: 25 };
```
