CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
TypeScript 进阶/课时/装饰器
RawBlame
课时目录12 节

TypeScript 进阶

  1. 01TS 进阶地图
  2. 02原始类型深入
  3. 03集合类型
  4. 04断言与收窄
  5. 05内置工具类型
  6. 06高级类型
  7. 07类与 OOP
  8. 08函数类型进阶
  9. 09装饰器
  10. 10命名空间
  11. 11工具链
  12. 12综合练习

装饰器

decorators;Nest/实验性语法。

30 分钟

装饰器

装饰器(Decorators)是一种 元编程 语法,可在类、方法、属性、参数上附加元数据或变换行为。TypeScript 5+ 支持 Stage 3 装饰器;nestjs-essentials 大量使用 @Controller、@Injectable 等装饰器构建 DI 容器。本课衔接 typescript-essentials 与 nextjs-essentials(Next 本身少用装饰器,但后端 API 层常配合 Nest)。

学习目标

  • 理解装饰器执行顺序与分类
  • 启用 tsconfig 中的 experimentalDecorators / 新标准装饰器
  • 阅读 NestJS 内置装饰器的使用模式

启用装饰器

// tsconfig.json
{
  "compilerOptions": {
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "useDefineForClassFields": true
  }
}

NestJS 依赖 reflect-metadata 在运行时读取参数类型,配合 emitDecoratorMetadata。

类装饰器

function sealed(constructor: Function) {
  Object.seal(constructor);
  Object.seal(constructor.prototype);
}

@sealed
class TrackModule {
  constructor(public name: string) {}
}

方法装饰器

function log(target: unknown, propertyKey: string, descriptor: PropertyDescriptor) {
  const original = descriptor.value as (...args: unknown[]) => unknown;

  descriptor.value = function (...args: unknown[]) {
    console.log(`Calling ${propertyKey}`, args);
    return original.apply(this, args);
  };

  return descriptor;
}

class Greeter {
  @log
  greet(name: string): string {
    return `Hello, ${name}`;
  }
}

属性与参数装饰器

function required(_target: object, propertyKey: string) {
  // 元数据标记,配合 validation 框架
}

class CreateLessonDto {
  @required
  title!: string;

  constructor(@required title: string) {
    this.title = title;
  }
}

NestJS 风格示例

// 简化示意,实际由 @nestjs/common 提供
function Controller(prefix: string): ClassDecorator {
  return (target) => {
    Reflect.defineMetadata("path", prefix, target);
  };
}

function Get(path?: string): MethodDecorator {
  return (_target, _key, descriptor) => {
    Reflect.defineMetadata("method", "GET", descriptor.value!);
    Reflect.defineMetadata("path", path ?? "", descriptor.value!);
  };
}

@Controller("tracks")
class TracksController {
  @Get()
  list() {
    return [];
  }
}

练习

  • 创建一个 @Timing 方法装饰器,打印执行耗时
  • 阅读 nestjs-essentials 中 @Injectable 用法
  • 对比 Stage 3 装饰器与 legacy experimental 差异(查 TS 5 release notes)

小结

装饰器 = 声明式元编程,Nest 依赖注入与路由注册的核心机制。 下一课命名空间。

加载本节练习…
← 上一课函数类型进阶下一课 →命名空间