参数装饰器与元数据
将参数装饰器与 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 反馈 — 无需本地设置。
此课程中的所有课时
- 类装饰器:包装行为
- 方法与属性装饰器
- 参数装饰器与元数据
- 框架中的装饰器:NestJS 示例