装饰器是一种用 @ 符号标注的语法,可以给类、方法、属性、参数附加额外逻辑,常见于 NestJS、TypeORM 等后端框架,比如 @Controller、@Get 把普通方法标记为路由。它本质上是一个高阶函数:接收目标对象,返回修改后的对象,横向扩展功能而不侵入业务代码。
装饰器在 TS 中默认关闭,需要在 tsconfig 里开启 experimentalDecorators,且只能用于 class 成员。TC39 标准版装饰器从 TS 5.0 起支持,与旧的实验性实现并不兼容;旧的 emitDecoratorMetadata 加 reflect-metadata 方案则伴随大量现存框架。
// 需在 tsconfig 开启 experimentalDecorators function Log(target: any, key: string, desc: PropertyDescriptor) { const fn = desc.value; desc.value = function (...args: any[]) { console.log('调用', key, args); return fn.apply(this, args); }; } class Service { @Log save(name: string) { return name; } } new Service().save('tom'); // 控制台:调用 save ['tom']