0Pricing
TypeScript Academy · 课时

参数装饰器与元数据

将参数装饰器与 reflect-metadata 结合使用

参数装饰器与元数据 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。

欢迎

本课介绍 TypeScript 中的参数装饰器和元数据。

简介

装饰器是 JavaScript 的第 3 阶段提案,也是 TypeScript 的实验性特性,用于添加元数据以及修改类和类成员。

核心概念

装饰器是一个函数,可以使用 @ 语法应用于类、方法、属性或参数。
@sealed
class BugReport {
  type = 'report';
  title: string;
  constructor(t: string) { this.title = t; }
}

类装饰器

类装饰器接收构造函数,并可以返回修改后的版本。
function sealed(constructor: Function) {
  Object.seal(constructor);
  Object.seal(constructor.prototype);
}

方法装饰器

方法装饰器接收目标对象、属性名称和属性描述符。
function log(target: any, key: string, desc: PropertyDescriptor) {
  const orig = desc.value;
  desc.value = function(...args: any[]) {
    console.log('Calling', key);
    return orig.apply(this, args);
  };
}

属性装饰器

属性装饰器接收目标对象和属性键。它们无法直接拦截读取和写入操作。
function readonly(target: any, key: string) {
  Object.defineProperty(target, key, { writable: false });
}

参数装饰器

参数装饰器接收目标对象、方法名称和参数索引。
function required(target: any, key: string, index: number) {
  const meta = Reflect.getMetadata('required', target, key) || [];
  meta.push(index);
  Reflect.defineMetadata('required', meta, target, key);
}

装饰器工厂

装饰器工厂是一个返回装饰器的函数。它接受配置参数。
function role(name: string) {
  return function(target: any, key: string) {
    Reflect.defineMetadata('role', name, target, key);
  };
}

class UserController {
  @role('admin')
  deleteUser() {}
}

NestJS 装饰器

NestJS 广泛使用装饰器来实现控制器、依赖注入和路由。
@Controller('users')
class UsersController {
  constructor(private usersService: UsersService) {}

  @Get()
  findAll(): User[] {
    return this.usersService.findAll();
  }
}

reflect-metadata

装饰器通常与 reflect-metadata 兼容填充实现配合,在运行时存储和检索元数据。
import 'reflect-metadata';
// Enable in tsconfig: experimentalDecorators: true, emitDecoratorMetadata: true

装饰器顺序

同一声明上的多个装饰器会从下到上应用(最后书写的装饰器会先求值)。
@first
@second
class Example {}
// Applied: second first, then first

快速检查

要使用装饰器,需要什么 TypeScript 配置?

回顾

装饰器使用 @ 语法来修改类、方法、属性和参数。它们通过 tsconfig 中的 experimentalDecorators 启用,并被 NestJS 和 Angular 等框架广泛使用。

常见问题解答

「参数装饰器与元数据」课时是免费的吗?

是的 — 「参数装饰器与元数据」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。

「参数装饰器与元数据」这节课中我会学到什么?

将参数装饰器与 reflect-metadata 结合使用 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 TypeScript Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「参数装饰器与元数据」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 TypeScript Academy 课中编写并运行代码吗?

能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 类装饰器:包装行为
  2. 方法与属性装饰器
  3. 参数装饰器与元数据
  4. 框架中的装饰器:NestJS 示例
← 返回 TypeScript Academy