← 返回目录

第 2 卷

第 2 / 6 卷日期:

5

6function getLength<T extends HasLength>(arg: T): number {
7return arg.length;
8}

9

10getLength("hello");// 5(string有length)
11getLength([1,2,3]);// 3(数组有length)
12// getLength(123); //报错:number无length属性
  1. 枚举 (Enum) 类型是什么?如何工作?

枚举(Enum)是 TS 新增的类型,用于定义一组命名的常量,让代码更易读、易维护,核心是“将魔法值(如 0/1/2)映射为语义化名称”。

分类与工作原理

  1. 数字枚举(默认):
  • 枚举成员默认从 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"]); // 报错:无反向映射

  1. 常量枚举( 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 {

3export function add(a: number, b: number): number {//需export才能外部访问
4return 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 项目(推荐)老项目兼容、单个文件内代码分组

全站分卷索引 · 6 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷
  4. 4第 4 卷
  5. 5第 5 卷
  6. 6第 6 卷