装饰器与元数据编程通过在类、方法等结构上附加行为实现代码复用,结合reflect-metadata库可在运行时读写元数据,常用于依赖注入等场景。

J*aScript 装饰器与元数据编程是现代前端开发中越来越重要的技术,尤其在 TypeScript 和框架如 Angular、NestJS 中广泛应用。它们允许你在类、方法、属性等代码结构上附加额外行为或信息,实现关注点分离和代码复用。下面通过实战角度带你掌握装饰器与元数据的结合使用。
装饰器本质上是一个函数,它会在目标被定义时执行,并接收目标的元信息作为参数。TypeScript 支持以下四种装饰器:
配合元数据可提取参数类型或用途。启用装饰器需在 tsconfig.json 中开启相关配置:
{
"experimentalDecorators": true,
"emitDecoratorMetadata": true
}
原生 J*aScript 不保留类型信息到运行时,而 reflect-metadata 库填补了这一空白。通过它,你可以在装饰器中存储和读取元数据。
安装依赖:
npm install reflect-metadata --s*e
在入口文件顶部引入:
import 'reflect-metadata';
示例:为方法添加元数据标签:
function Log(target: any, propertyName: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`Calling "${propertyName}" with arguments:`, args);
return originalMethod.apply(this, args);
};
// 存储元数据
Reflect.defineMetadata('custom:logged', true, target, propertyName);
}
利用装饰器和元数据,可以实现一个轻量级依赖注入系统。
来画数字人|直播|
来画数字人自动化|直播|,无需请真人主播,即可实现24小时|直播|,无缝衔接各大|直播|平台。
57
查看详情
定义 @Injectable 装饰器标记可注入类:
function Injectable() {
return function (constructor: Function) {
Reflect.defineMetadata('di:injectable', true, constructor);
};
}
定义 @Inject 装饰器标记构造函数参数:
function Inject(token: any) {
return function (target: any, propertyKey: string | symbol, parameterIndex: number) {
let existingTokens = Reflect.getMetadata('di:tokens', target) || [];
existingTokens[parameterIndex] = token;
Reflect.defineMetadata('di:tokens', existingTokens, target);
};
}
简单容器实现:
class Container {
private instances = new Map();
resolve<T>(token: Function): T {
if (this.instances.has(token)) {
return this.instances.get(token);
}
const tokens = Reflect.getMetadata('di:tokens', token) || [];
const dependencies = tokens.map(dep => this.resolve(dep));
const instance = new token(...dependencies);
this.instances.set(token, instance);
return instance;
}
}
使用方式:
@Injectable()
class Logger {
log(msg: string) { console.log(msg); }
}
@Injectable()
class Service {
constructor(@Inject(Logger) private logger: Logger) {}
run() { this.logger.log('Service running'); }
}
目前装饰器语法仍在提案阶段(Stage 3),不同版本间可能存在差异。TypeScript 默认使用旧版装饰器模型,建议在 tsconfig.json 中明确设置:
"target": "ES2025", "experimentalDecorators": true, "emitDecoratorMetadata": true, "useDefineForClassFields": false
新版装饰器(2025+)语义更清晰,但生态适配仍在进行中。当前 NestJS 等框架仍基于旧模型运作。
基本上就这些。掌握装饰器与元数据组合,能让你写出更具扩展性和可维护性的代码,特别是在构建框架或复杂应用架构时非常有用。
以上就是J*aScript装饰器_元数据编程实战的详细内容,更多请关注其它相关文章!
# javascript
# java
# js
# 元数据
# 复用
# 怎么进行精准营销推广呢
# 是一个
# 这一
# 是在
# 沈阳祥云平台网站建设
# seo日志工具
# 惠州网站建设策划书
# 吉安互联网seo
# 推荐seo优化价格优惠
# 完美的网站推广
# 抖音APP大数据营销推广方案
# 罗湖区网站建设效果
# 西安高端网站建设电话
# 如何实现
# 如何用
# 错误信息
# 四种
# 自定义
# 作用于
# 代码
# ai
# 前端开发
# app
# npm
# typescript
# json
# 前端
相关文章:
Python中高效访问嵌套字典与列表中的键值对
如何使用Node.js csv 包按条件移除含空字段的CSV记录
CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题
印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】
word邮件合并后日期格式不对怎么改_Word邮件合并日期格式修改方法
如何修改开机登录密码_Windows账户安全设置超详细教程【必学】
AO3官方在线访问地址 Archive of Our Own最新镜像合集
jQuery Mask 插件中实现电话号码固定前导零的教程
使用PHP DOM解析器高效提取HTML中特定标题及其紧邻段落
解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException
如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置
html怎么运行外部js文件中的函数_运html外js文件函数法【技巧】
拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧
b站怎么看视频的弹幕数量_b站弹幕数量查看方法
vivo浏览器怎么扫描二维码 vivo浏览器内置扫一扫功能使用方法
深入理解J*a链表中的IPosition接口与使用
如何使用纯J*aScript判断Input元素是否在特定类容器内
mc.js游戏直达 mc.js网页免下载版本秒进地址
解决macOS上安装pyhdf时‘hdf.h’文件缺失的编译错误
深入理解J*a编译器的兼容性选项:从-source到--release
UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】
PHP表单提交消息延迟显示:Post-Redirect-Get模式深度解析与实践
html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】
在React函数组件中利用原生HTML5进行邮箱地址验证
J*aScript数组对象转换:按指定键分组与值收集
J*aScript中localStorage数据的获取、清洗与格式化教程
excel怎么制作工资条 excel快速生成工资条的方法
狙击外星人小游戏开始_狙击外星人小游戏立即开始
小红书怎么解除第三方平台绑定_小红书多平台登录解绑方法介绍
最新韩小圈网页版登录入口_官网在线观看官方链接
解决Django多数据库/多Schema环境下外键迁移问题
12306选座怎么选到临时改签座_12306改签选座策略与步骤
windows10怎么关闭系统提示音_windows10彻底静音设置方法
b站怎么取消点赞_b站点赞取消操作方法
微信语音通话掉线如何解决 微信语音通话稳定优化方法
PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符
yandex入口引擎手机版 yandex安卓版下载入口
Python模块化编程:有效管理依赖与避免循环引用
在VS Code中配置和运行Dart程序的完整步骤
php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】
淘宝支付提示失败如何解决 淘宝支付流程优化方法
顺丰快递查单号物流信息 顺丰快递小程序查询入口
字由网在线版登录地址 字由网网页版安全入口
qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程
必由学登录入口 必由学官方网站在线访问链接
PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】
微信商城在哪里打开【步骤】
ACG动漫视频网入口 ACG动漫*免费正版观看地址
如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】
高德地图公交到站提醒失败如何解决 高德提醒权限设置
*请认真填写需求信息,我们会在24小时内与您取得联系。