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

网站被k申述泉州专业网站建设公司

网站被k申述,泉州专业网站建设公司,学网站建设难吗,wordpress安装到子目录下一、TypeScript 装饰器(Decorator) 1. 概述 装饰器是 ES 装饰器提案(Decorator Proposal) 的实现,它是 TypeScript 中的实验性特性(需启用),主要用于 对类、方法、属性等添加元编程能…

一、TypeScript 装饰器(Decorator)

1. 概述

装饰器是 ES 装饰器提案(Decorator Proposal) 的实现,它是 TypeScript 中的实验性特性(需启用),主要用于 对类、方法、属性等添加元编程能力

// tsconfig.json
{"experimentalDecorators": true,"emitDecoratorMetadata": true
}

2. 装饰器的类型

装饰器类型目标执行时机可访问信息
类装饰器类定义时构造函数
属性装饰器类的属性类定义时类原型、属性名
方法装饰器类的方法类定义时原型、方法名、属性描述符
访问器装饰器getter/setter类定义时原型、访问器名、属性描述符
参数装饰器方法参数类定义时原型、方法名、参数位置

3. 执行顺序(重要)

多个装饰器的执行顺序:

@ClassDeco
class MyClass {@PropertyDecomyProperty: string;@MethodDecomyMethod(@ParamDeco param: string) { }
}

执行顺序为:

  1. 参数装饰器
  2. 方法装饰器
  3. 属性装饰器
  4. 类装饰器

且从下往上执行多个装饰器(即先内后外)。


4. 每种装饰器的实现机制

a. 类装饰器

function Logger(constructor: Function) {console.log("类装饰器触发", constructor.name);
}
  • 装饰器函数接收构造函数作为参数;
  • 可以返回一个新的构造函数(替换类);
  • 适合用于依赖注入、静态注册、元信息记录等场景。

b. 方法装饰器

function Log(target: any, methodName: string, descriptor: PropertyDescriptor) {const original = descriptor.value;descriptor.value = function (...args: any[]) {console.log(`调用 ${methodName} 参数:`, args);return original.apply(this, args);};
}
  • 装饰的是方法;
  • 可用来包装逻辑,如日志记录、性能监控、错误捕获。

c. 属性装饰器

function Watch(target: any, propertyKey: string) {console.log(`属性 ${propertyKey} 被定义在:`, target);
}
  • 不能获取属性值;
  • 主要用于元信息注册(如序列化字段、ORM 映射)。

d. 参数装饰器

function Inject(target: any, method: string, index: number) {console.log(`${index}个参数被装饰`);
}
  • 可用于依赖注入容器中识别参数依赖。

5. 元数据机制(emitDecoratorMetadata + reflect-metadata)

配合 emitDecoratorMetadata: true,TS 会自动注入类型信息元数据,供运行时使用:

function LogType(target: any, key: string) {const type = Reflect.getMetadata("design:type", target, key);console.log(`${key} 类型是:`, type.name);
}

依赖 reflect-metadata 库,该库实现了 Reflect API 和元信息存储机制。


6. 本质实现流程(底层)

TypeScript 编译器做了什么?

  • 识别装饰器语法;
  • 按照目标(类、方法等)插入调用;
  • 若开启 emitDecoratorMetadata,会插入 Reflect.metadata(...) 调用;
  • 所有装饰器代码 保留在运行时代码中执行

关键特性:

  • 完全运行时执行;
  • 动态性强,但性能开销也存在;
  • 可构建框架功能(如 NestJS、TypeORM 全靠它)。

二、ArkTS 装饰器

1. 背景与定位

ArkTS 是 OpenHarmony(鸿蒙系统)为其 UI 框架定制的 TypeScript 方言,装饰器不是用于“扩展元编程能力”,而是 用于状态声明、组件通信、生命周期管理的 DSL 语义标记

装饰器是告诉编译器:这里是状态,这里是绑定,这里是通信入口。


2. 装饰器类型及其语义行为(编译期语义,重点)

装饰器作用范围编译器行为描述
@State组件内部变量生成 getter/setter,自动追踪值变化,触发 UI 更新
@Prop父传子属性父值传入子组件,只读,单向同步
@Link父子共享属性双向同步,子组件改值会同步给父组件
@Provide提供跨层级状态生成上下文注入代码
@Consume使用跨层级状态注入 Provide 提供的值
@ObservedV2响应式类标记深度监听类中属性
@Trace标记需监听的字段用于 @ObservedV2 类内部
@LocalStorage本地状态持久化编译生成持久化代码(通过本地 KV 存储)
@AppStorage全局状态存储跨组件共享状态,支持持久化
@Builder构建函数注册编译生成可复用的 UI 构造器
@Styles, @Extend样式注入编译为内部样式调用

3. 编译机制详解(核心)

与 TypeScript 装饰器不同,ArkTS 装饰器是编译器指令,不是运行时代码。

ArkCompiler 处理流程:

  1. 解析装饰器:构建 AST(抽象语法树)后,发现 @State@Link 等装饰器;

  2. 绑定语义处理器:每种装饰器都关联特定代码生成逻辑;

  3. 生成代码逻辑

    • @State:创建 getter/setter,并绑定变化监听逻辑;
    • @Link:生成数据绑定结构,修改值时同时刷新父子组件;
    • @Prop:设置为只读,插入一段更新依赖结构;
    • @ObservedV2:修改类的原型链,让其属性变化也会触发通知;
  4. 插入 UI 更新逻辑:绑定变量变化 → 触发 UI 重新渲染 → 更新虚拟 DOM → 重新绘制。


4. 例子:编译器到底“变出了什么”

@Component
struct Counter {@State count: number = 0;build() {Text(this.count.toString());Button("Add", () => this.count++);}
}

编译器背后大致生成:

let _count = 0;
function get_count() { return _count; }
function set_count(v) {_count = v;__triggerUIUpdate();  // 插入 UI 更新代码
}

Text() 内绑定的是 getter,this.count++ 实际调用的是 setter,UI 更新由编译器处理。


5. 装饰器之间的交互机制

例如:

@ObservedV2 class Address { @Trace street = ''; }
@Component struct A {@State addr: Address = new Address();
}
@Component struct B {@ObjectLink addr: Address;
}
  • 编译器发现 @ObservedV2 → 为 Address 生成监听结构;
  • @ObjectLink → 绑定状态引用;
  • 修改 addr.street → 自动触发 A/B 组件 UI 更新;
  • 若整体替换 addr → 同步被断开(需深拷贝保护)。

6. 核心特点(和 TS 装

饰器对比)

特性TypeScript 装饰器ArkTS 装饰器
执行时机运行时执行编译期处理
类型扩展任意目标仅限组件相关语义
灵活度极高受限于框架设计
运行开销有运行期反射负担无,提前生成逻辑
主要目的元编程、通用逻辑状态管理、UI更新
扩展方式写逻辑函数不能自定义,只能用框架内置装饰器

总结:TypeScript vs ArkTS 装饰器(深入+对比)

方面TypeScript 装饰器ArkTS 装饰器
本质运行时代码增强函数编译期语义标记(类似 DSL)
目标范围类、属性、方法、参数等组件状态、通信、样式、响应式对象等
编译器行为保留运行时代码,靠 Reflect 机制删除装饰器,生成 UI 状态同步逻辑
用户扩展性可自由实现装饰器逻辑受限,只能使用系统定义的装饰器
开发定位通用语言特性UI DSL 编译指令
使用效果功能灵活,逻辑自由开发效率高,结构清晰,性能高,但灵活性低
http://www.dtcms.com/a/520054.html

相关文章:

  • FLUMINER福禄T3 115T挖矿机深度评测:智能管理与高效性能如何平衡?
  • 怎么调网站兼容性公益网站怎么做
  • 压缩与缓存调优实战指南:从0到1根治性能瓶颈(四)
  • 嵌入式软件架构--显示界面架构(工厂流水线模型,HOME界面,命令界面)
  • Ubuntu20.04 + QT5.14.2 + Android23的开发平台搭建总结
  • 【思维链条CoT与React模式深度解析】AI智能体的核心推理框架
  • svchost第一个是rpcss第二个是termsvcs第三个是NetworkService第四个是LocalService第五个是netsvcs----备忘
  • 餐饮网站模板免费下载jetpack wordpress
  • Hadoop High Availability 简介
  • Tier 1 供应商EDI对接:Forvia EDI需求分析
  • 2025最新策略答案引擎优化(AEO):在AI搜索引擎中获得更多曝光
  • SpringAI Redis RAG 搜索
  • 服务器和域名都有了 怎么做网站网站seo诊断分析报告
  • SpringBoot的Web开发
  • 基于springboot的大创管理系统开发与设计
  • GitHub 热榜项目 - 日榜(2025-10-23)
  • RAG:让大模型“既懂又查”的智能系统
  • cms网站建设的优缺点wordpress两个站合并
  • 数据结构——B树及其基本操作
  • java.text.MessageFormat的用法
  • 公司网站怎么做分录平面设计怎么网上接单
  • Java爬虫性能优化:以喜马拉雅音频元数据抓取为例
  • 使用 Java 对 PDF 添加水印:提升文档安全与版权保护
  • CRMEB-PHP订单改价模块详解
  • 丽水 网站建设注册163免费邮箱
  • 网站建设微信开发怎么做订阅号
  • TypeScript Array(数组)
  • E160系列全国产超外差无线射频模块技术解析与应用指南
  • 20251023在Ubuntu20.04.6上编译AIO-3576Q38开发板的Android14
  • 故障后数据备份