第 2 卷
5
| 6 | function getLength<T extends HasLength>(arg: T): number { |
|---|---|
| 7 | return arg.length; |
| 8 | } |
9
| 10 | getLength("hello");// 5(string有length) |
|---|---|
| 11 | getLength([1,2,3]);// 3(数组有length) |
| 12 | // getLength(123); //报错:number无length属性 |
- 枚举 (Enum) 类型是什么?如何工作?
枚举(Enum)是 TS 新增的类型,用于定义一组命名的常量,让代码更易读、易维护,核心是“将魔法值(如 0/1/2)映射为语义化名称”。
分类与工作原理
- 数字枚举(默认):
- 枚举成员默认从 0 开始自增,也可手动指定值;
- 支持“反向映射”(值 → 名称)。
Code block
1enum Direction { 2Up, // 0
3Down, // 1 4Left, // 2
5Right // 3 6}
7 8console.log(Direction.Up); // 0(正向映射)
9console.log(Direction[0]); // "Up"(反向映射)
10 11// 手动指定起始值
12enum Status { 13Success = 200,
14NotFound = 404, 15ServerError = 500
16}
- 无自增特性,必须手动指定每个成员的字符串值;
- 不支持反向映射。
Code block
1enum Color { 2Red = "#ff0000",
3Green = "#00ff00", 4Blue = "#0000ff"
5} 6console.log(Color.Red); // "#ff0000"
7// console.log(Color["#ff0000"]); // 报错:无反向映射
- 常量枚举( const enum):
- 编译时会被内联到使用处,无额外代码生成,性能更好;
- 不支持反向映射。
Code block
1const enum Week { 2Mon,
3Tue 4}
5const day = Week.Mon; // 编译后:const day = 0;(无 Week 变量生成)
核心用途
- 定义状态码、方向、权限等固定值集合;
- 替代魔法值,提升代码可读性(如用 Status.Success 代替 200)。
5. 模块 (Modules) 和命名空间 (Namespaces) 的使用
模块 (Modules)
TS 的模块与 ES6 模块完全一致,文件即模块,通过 import/export 实现代码隔离和复用,是现代 TS 项目的核心组织方式。
使用示例:
Code block
6export const PI = 3.14;
7 8// app.ts(导入模块)
9import { add, PI } from "./utils";
10console.log(add(1, 2)); // 3
命名空间 (Namespaces)
原名“内部模块”,是 TS 早期为解决“模块系统未标准化”设计的特性,用于在单个文件内隔离代码,现在已逐步被 ES 模块替代,仅用于兼容老项目。
使用示例:
Code block
1// 定义命名空间 2namespace MathUtils {
| 3 | export function add(a: number, b: number): number {//需export才能外部访问 |
|---|---|
| 4 | return a + b; |
| 5 | } |
6 7const PI = 3.14; // 未 export,仅命名空间内可见
8} 9
10// 使用命名空间 11console.log(MathUtils.add(1, 2)); // 3
12// console.log(MathUtils.PI); // 报错:PI 未导出
核心区别
| 特性 | 模块 (Modules) | 命名空间 (Namespaces) |
|---|---|---|
| 隔离范围 | 文件级隔离 | 文件内隔离 |
| 依赖管理 | 支持 import/export,可 | 仅文件内,跨文件需用 /// |
| 跨文件 | <reference path="..." |
/>
适用场景现代 TS 项目(推荐)老项目兼容、单个文件内代码分组