当前位置: 首页 > news >正文

【TS入门笔记4---装饰器】

TS入门笔记4

  • TypeScript---装饰器
  • 一、装饰器基础
      • 1. 定义与作用:装饰器是一种特殊类型的声明,它可以被附加到类声明、方法、访问符、属性或参数上,用来修改类的行为。在 TypeScript 里,装饰器本质上是一个函数,它接收不同的参数并返回一个新的类、方法、属性等。要使用装饰器,需要在tsconfig.json里开启experimentalDecorators选项。
      • 2. 配置与启用
  • 二、装饰器分类
      • 1. 类装饰器:作用对象是类的构造函数。扩展类属性、替换类定义或添加元数据。
      • 2. 方法装饰器
      • 3. 属性装饰器
      • 4. 参数装饰器
  • 三、高级技巧
      • 1. 装饰器工厂:通过闭包传递参数,生成定制化装饰器
      • 3. 元编程与依赖注入
  • 四、总结:
      • 1.装饰器的执行顺序
      • 2.装饰器的应用场景

TypeScript—装饰器

一、装饰器基础

1. 定义与作用:装饰器是一种特殊类型的声明,它可以被附加到类声明、方法、访问符、属性或参数上,用来修改类的行为。在 TypeScript 里,装饰器本质上是一个函数,它接收不同的参数并返回一个新的类、方法、属性等。要使用装饰器,需要在tsconfig.json里开启experimentalDecorators选项。

(1)本质:装饰器是一种特殊声明,通过 @expression 语法附加到类、方法、属性或参数上,用于动态扩展或修改代码行为,属于元编程技术。

(2)核心作用:
扩展功能:无需修改原始代码,动态添加日志、验证、缓存等功能。
元数据管理:标记依赖注入、路由路径等元信息

2. 配置与启用

实验性特性:需在 tsconfig.json 中启用 experimentalDecorators 选项:

{"compilerOptions": {"experimentalDecorators": true}
}

二、装饰器分类

1. 类装饰器:作用对象是类的构造函数。扩展类属性、替换类定义或添加元数据。

(1)禁止修改 Report 类的构造函数和原型

function Sealed(constructor: Function) {Object.seal(constructor);Object.seal(constructor.prototype);
}@Sealed
class Report {title: string;constructor(t: string) { this.title = t; }
}

2. 方法装饰器

参数:target(原型)、propertyKey(方法名)、descriptor(方法描述符)。
应用:添加日志、权限控制或缓存逻辑。
(1)缓存 fibonacci 方法结果以提升性能

function Cache(target: any, methodName: string, descriptor: PropertyDescriptor) {const originalMethod = descriptor.value;const cache = new Map();descriptor.value = function (...args: any[]) {const key = JSON.stringify(args);return cache.get(key) || (cache.set(key, originalMethod.apply(this, args)), cache.get(key);};
}class MathService {@Cachefibonacci(n: number): number { /* 计算逻辑 */ }
}

3. 属性装饰器

参数:target(原型)、propertyKey(属性名)。
应用:验证属性值或添加元数据。
(1)自动将 name 属性值转为大写

function Format(target: any, propertyKey: string) {let value = target[propertyKey];Object.defineProperty(target, propertyKey, {set: (newVal) => { value = newVal.toUpperCase(); },get: () => value});
}class User {@Formatname: string;
}

4. 参数装饰器

参数:target(原型)、methodName(方法名)、parameterIndex(参数位置)。
应用:记录参数信息或实现依赖注入。
(1)标记方法参数的元数据

function LogParameter(target: any, methodName: string, index: number) {console.log(`参数 ${index} 在方法 ${methodName} 中被标记`);
}class Service {getUser(@LogParameter id: string) { /* 逻辑 */ }
}

三、高级技巧

1. 装饰器工厂:通过闭包传递参数,生成定制化装饰器

(1)动态配置路由路径:

function Route(path: string) {return function (target: any, methodName: string, descriptor: PropertyDescriptor) {// 将路径与方法关联MetadataStorage.registerRoute(path, target.constructor, methodName);};
}class Controller {@Route('/users')getUsers() { /* 逻辑 */ }
}

(2)装饰器组合
执行顺序:
装饰器表达式:从上到下评估(工厂函数执行)。
装饰器函数:从下到上调用(装饰逻辑执行)。
输出顺序:Second 工厂 → First 工厂 → First 装饰器 → Second 装饰器

@First()
@Second()
class MyClass {}

3. 元编程与依赖注入

(1)依赖注入示例:框架自动注入 Database 实例

function Injectable(target: any) {// 注册到容器Container.register(target);
}@Injectable
class UserService {constructor(private db: Database) {}
}

四、总结:

1.装饰器的执行顺序

类装饰器最后执行。
方法和访问器装饰器优先于属性装饰器执行。
方法和访问器装饰器按照它们在代码中出现的顺序从下到上执行。
参数装饰器按照它们在参数列表中出现的顺序从左到右执行。

2.装饰器的应用场景

日志记录:如上述例子,在方法调用前后记录日志,方便调试和监控。
权限验证:可以在方法装饰器中实现权限验证逻辑,在调用方法前检查用户权限。

http://www.xdnf.cn/news/198829.html

相关文章:

  • DPanel 一款更适合国人的 Docker 管理工具
  • linux 使用nginx部署vue、react项目
  • 结合大语言模型的机械臂抓取操作学习
  • Python 中支持函数式编程的 operator 与 functools 包
  • 第一节:Linux系统简介
  • Android显示学习笔记本
  • 打造即插即用的企业级云原生平台——KubeSphere 4.1 扩展组件在生产环境的价值全解
  • 解决跨域实现方案
  • 用vite动态导入vue的路由配置
  • 本地部署Qwen-7B实战 vLLM加速推理
  • 网络协议之为什么要分层
  • 论文分享 | 基于区块链和签名的去中心化跨域认证方案
  • 受限字符+环境变量RCE
  • vue3:v-model的原理示例
  • python练习:求数字的阶乘
  • 思科bsp社招面试
  • JavaScript 与 Java 学习笔记
  • day9 python 热力图与子图的绘制
  • MYSQL——时间字段映射Java类型
  • 庙算兵棋推演AI开发初探(7-神经网络训练与评估概述)
  • FTP-网络文件服务器
  • 使用 Vue3 + Webpack 和 Vue3 + Vite 实现微前端架构(基于 Qiankun)
  • iVX 图形化编程如何改写后端开发新范式
  • EXCEL中跨行匹配两组数据
  • 流域生态系统碳排放、碳循环模拟与评估技术应用
  • 【基础篇】static_config采集配置详解
  • Vue 3 中通过 createApp 创建的 app 实例的所有核心方法,包含完整示例、使用说明及对比表格
  • 深入解析 PyTorch 中的 torch.distributions模块与 Categorical分布
  • 2025吃鸡变声器软件推荐
  • 【Vue3 组合式 API 在大型项目中的实践:useOperatorData 封装与应用】