Typescript 属性装饰器可以为类设置元数据吗?

2024-03-14

在打字稿中,是否可以使用属性装饰器来设置类的元数据?考虑下面的代码。类装饰器的“目标”显然与属性装饰器的“目标”不同。我可以从另一个派生出一个吗?

import 'reflect-metadata';


const MY_CLASS_DECORATOR_KEY = 'MyClassDecoratorKey';
const MY_PROPERTY_DECORATOR_KEY = 'MyPropertyDecoratorKey';

export const MyClassDecorator = options => {
    return function (target) {
      console.log('class target: ' , target);
      Reflect.defineMetadata(MY_CLASS_DECORATOR_KEY, options, target);
    };
};

export const MyPropertyDecorator = (options): PropertyDecorator => {
    return (target, property) => {
      console.log('property target: ' , target);
      const metadata = Reflect.getMetadata(MY_PROPERTY_DECORATOR_KEY, target) || {};
      metadata[property] = options;
      Reflect.defineMetadata(MY_PROPERTY_DECORATOR_KEY, metadata, target);
    };
};

@MyClassDecorator('my class decorator value')
class MyClass {
    @MyPropertyDecorator('first my property decorator value')
    myFirstProperty: any;

    @MyPropertyDecorator('second my property decorator value')
    mySecondProperty: any;
}

console.log('keys: ', Reflect.getMetadataKeys(MyClass));

注意输出:

property target:  MyClass {}
property target:  MyClass {}
class target:  function MyClass() {
    }
keys:  [ 'MyClassDecoratorKey' ]

如何获取元数据键以同时显示属性装饰器中的键?


是的,您可以在装饰器中自由地做任何您想做的事情,但正如您发现的那样,您的问题在于您正在传递的目标。

基本上,在属性装饰器中,target参数可以是以下两种情况之一,具体取决于装饰器是用于静态属性还是实例属性:

对于静态属性,target财产将是类构造函数。这意味着静态属性的目标将与类装饰器的目标完全相同。

但是,在实例属性上,target参数将是prototype您创建的类的,而不是构造函数的。这就是为什么您会看到您所看到的行为。对于实例属性,您的元数据不会附加到constructor就像你的类装饰器的情况一样。

不过,仍然有希望,因为给定原型实例,您可以轻松访问构造函数,因为它存储在名为的属性中constructor。因此,就您的情况而言,您可以通过执行以下操作来获得您正在寻找的行为:

export const MyPropertyDecorator = (options): PropertyDecorator => {
    return (target, property) => {
      var classConstructor = target.constructor;
      console.log('property target: ' , classConstructor);
      const metadata = Reflect.getMetadata(MY_PROPERTY_DECORATOR_KEY, classConstructor) || {};
      metadata[property] = options;
      Reflect.defineMetadata(MY_PROPERTY_DECORATOR_KEY, metadata, classConstructor);
    };
};

注意:上述更改适用于实例属性,但不适用于静态属性。如果您需要处理这两种类型的属性,则需要添加一些额外的逻辑来确定是否使用target or target.constructor

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Typescript 属性装饰器可以为类设置元数据吗? 的相关文章

随机推荐

  • 通过flask/python在html中显示从couchDB附加的图像

    我正在使用 Flask 和 python 从 couchdb 获取图像附件 然后将图像传递到 imgurl html 进行显示 问题是我只得到这个 返回 0x103b9c0b8 gt 处的 couchdb http ResponseBody
  • 跨线程操作无效:从创建它的线程以外的线程访问控制“textBox1”[重复]

    这个问题在这里已经有答案了 我想使用 UART 将温度值从微控制器发送到 C 接口并显示温度Label Content 这是我的微控制器代码 while 1 key scan get value of temp if Usart Data
  • 具有多个按钮和多个视频的 Listactivity

    我有一个 listactivity 应用程序 由 5 行组成 每行包含一个文本和 5 个按钮 文本和按钮都是可单击的 文本将打开 MyDay 活动 即文本视图 当您单击任何按钮时 它必须打开视频视图屏幕 其工作正常 如下图所示 但我的问题是
  • jQuery.each() 如何处理关联数组(对象)?

    我有一个关联数组 里面有两个对象 运行这个 myassoc each 回调仅运行一次 回调参数 索引和对象 也分别返回 0 和整个关联数组 人们会期望jQuery each 对数组中的每个元素运行 返回正确的键作为索引 返回正确的元素作为对
  • 替换 PhotoSwipe 库中的图像

    我有一个照片滑动 http www photoswipe com 我的页面上的画廊是这样以编程方式创建的 var instance window Code PhotoSwipe attach image options 现在我想更新图库中的
  • 在 Django 单元测试中使用会话对象

    我正在编写一个登录视图 并想为该视图添加单元测试 我的观点是这样的 def login request if request POST usrname request POST get username password request P
  • NLog - 删除超过 X 天的日志

    如何删除日志早于 X 天的文件 这很简单 但我在一个文件夹中只记录一天的日志 我的 NLog config 如下所示
  • Gnuplot 列堆叠直方图 - 行/行计数

    我有一个数据文件 其中包含未定义数量的条目 如下所示 A B C D E 1 0 2 5 4 7 4 3 4 1 8 7 4 0 7 1 1 第一行代表工作时间 然后以交替的方式暂停等等 为了可视化这一点 我通过定义两种具有不同颜色的线条样
  • 打印 char 的十进制值

    打印字符的十进制值的程序 include
  • Microsoft.Azure.NotificationHubs 1.0.9 是否与 .NET Core 2.0 兼容?

    我们将NotificationHubs 1 0 9 版与 NetCore 2 0 和 Net Framework 4 7 结合使用 在编译时 我们收到此警告 包 Microsoft Azure NOtificationHubs 1 0 9
  • 在角度4中为不同页面设置不同布局的最佳方法

    我是 Angular 4 的新手 我想要实现的是为应用程序中的不同页面设置不同的布局页眉和页脚 我有三种不同的情况 登录 注册页面 无页眉 无页脚 路线 登录 注册 营销网站页面 这是根路径 它有页眉和页脚 这些部分大多在登录之前出现 路线
  • Java/Wicket:使用资源编译基本的 Hello World

    我正在关注这个 Hello World Wicket 应用程序的示例 https www ibm com developerworks web library wa aj wicket https www ibm com developer
  • JNI - 在 Java 和 Native 代码之间传递大量数据

    我正在努力实现以下目标 1 我在java端有一个代表图像的字节数组 2 我需要让我的本机代码访问它 3 本机代码使用 GraphicsMagick 解码该图像 并通过调用 resize 创建一堆缩略图 它还计算图像的感知哈希 该哈希可以是向
  • Java Web 应用程序中的唯一序列号

    我一直想知道生成唯一 ID 的正确做法是什么 事情是在我的网络应用程序中 我将有一个插件系统 当用户注册一个插件时 我想为其生成一个唯一的序列号 我一直在考虑将所有数字存储在服 务器上的数据库或文件中 生成随机数并检查它是否已存在于数据库
  • 控制 make 的详细程度

    我正在使用 makefile 来编译由许多组成的程序 c文件 并且任何时间make被调用时 它仅编译上次运行后修改的那些文件 直到这里没有什么特别的 为了避免屏幕混乱 我在前面添加了 在每个的开头 CC 打电话 在它之前我打印一个定制的ec
  • Magento 2 设计主题选项卡丢失

    你好 我正在尝试 magento 2 并努力安装新主题 因为设计主题未显示在 商店 gt 配置 gt 设计 下 它已移至内容 设计 配置
  • 在实际设备中安装.apk文件仅用于测试

    我想在实际设备上测试我的应用程序 那么我该如何进行呢 它是附件吗sign in并使用zipalign为此目的 或者它们在准备发布我的申请时有用吗 有没有办法在不使用 eclipse 的情况下在实际设备上测试我的应用程序 下载并安装安卓软件开
  • Spring-mvc-jpa 与 Maven 错误创建 bean

    这是我的第一个问题 我是 Spring MVC 和 Jpa 的新手 我遇到了这个麻烦 我自己无法弄清楚 我尝试在 Google 上搜索 但没有找到与此错误相关的内容 我已将所有配置文件存储在 src main resources META
  • 在 Android 布局中对齐左右边缘的文本视图

    我正在开始使用Android 我无法进行简单的布局 我想用一个LinearLayout到位置二TextViews在单行中 一TextView一个在左侧 另一个在右侧 类似于 CSS 中的 float left float right 这可能
  • Typescript 属性装饰器可以为类设置元数据吗?

    在打字稿中 是否可以使用属性装饰器来设置类的元数据 考虑下面的代码 类装饰器的 目标 显然与属性装饰器的 目标 不同 我可以从另一个派生出一个吗 import reflect metadata const MY CLASS DECORATO