# 第2章:基础类型与变量
## any、unknown、never 类型
### 1. `any` 类型
`any` 是 TypeScript 中最灵活的类型,它允许变量绕过静态类型检查。
**特点**:
- 可以赋值给任意类型,也可以接收任意类型的值。
- 相当于关闭了类型检查,应谨慎使用(可能失去 TypeScript 的优势)。
**示例**:
```typescript
let data: any = "Hello";
data = 42; // 合法
data = [1, 2]; // 合法
使用场景:
- 迁移旧 JavaScript 代码时临时使用。
- 处理动态内容(如第三方库或用户输入)。
2. unknown 类型
unknown 是 TypeScript 3.0 引入的类型,比 any 更安全。
特点:
- 可以接收任意类型的值,但不能直接操作(需先进行类型检查或断言)。
- 强制开发者显式处理类型问题。
示例:
let userInput: unknown = fetchUserInput(); // 假设返回类型不确定
// 错误:直接操作会报错
// console.log(userInput.toUpperCase());
// 需先进行类型检查
if (typeof userInput === "string") {
console.log(userInput.toUpperCase()); // 合法
}
与 any 的区别:
unknown是“类型安全”的顶层类型,而any不是。
3. never 类型
never 表示永远不会发生的值,通常用于函数返回值或不可能的分支。
特点:
- 函数抛出异常或无限循环时返回
never。 - 联合类型中
never会被自动忽略。
示例:
// 抛出错误的函数
function throwError(message: string): never {
throw new Error(message);
}
// 不可能的类型分支
type Result = string | number;
function checkType(value: Result) {
if (typeof value === "string") {
// 处理字符串
} else if (typeof value === "number") {
// 处理数字
} else {
// 此处 value 的类型是 never
console.log(value); // 编译时会报错
}
}
使用场景:
- 强制处理所有可能的类型分支(如联合类型检查)。
- 标记不可能返回的函数。
对比总结
| 类型 | 描述 | 安全性 |
|---|---|---|
any | 任意类型,跳过类型检查 | ❌ 不安全 |
unknown | 任意类型,需显式类型检查 | ✅ 安全 |
never | 表示不可能存在的值 | ✅ 类型系统优化 |
### 补充说明
- **最佳实践**:优先使用 `unknown` 替代 `any` 以提高类型安全性。
- **类型断言**:对 `unknown` 类型可通过 `as` 或类型保护缩小范围。