【问题标题】:How can property decorators be invoked at runtime?如何在运行时调用属性装饰器?
【发布时间】:2023-04-09 11:51:01
【问题描述】:

很好奇我们如何在运行时调用属性装饰器。例如,如果我们运行以下代码:

    function PropertyDecorator(
        target: Object, // The prototype of the class
        propertyKey: string | symbol // The name of the property
        ) {
        console.log("PropertyDecorator called on: ", target, propertyKey);
    }

    class PDE {
        @PropertyDecorator
        name: string;
    }

它将记录PropertyDecorator called on: PDE {} name,因此在类加载时会调用装饰器。假设我们想在 PDE 的实例上再次调用它,如下所示:

const newPDE = PDE();
callDecoratorsOnProperties(newPDE);

这是怎么做到的?

【问题讨论】:

  • 您无法重新运行装饰器,但根据您要执行的操作,有不同的解决方案可以运行代码
  • 据我了解,装饰器在创建类时被应用为对类的修改。如果您查看装饰器的转译方式,它似乎不会在类创建之外持续存在。 babeljs.io/repl(通过插件部分打开旧版装饰器插件以查看它的实际效果)
  • 浏览github.com/typestack/class-validator 的代码库...但它有点“参与”所以我试图了解他们是如何使用validate(instance) 调用装饰器...

标签: javascript typescript annotations decorator


【解决方案1】:

cmets 是正确的。属性装饰器不能在运行时调用。它们只是设计时的结构。因此,示例问题中的日志记录语句仅在类加载期间运行,然后再也不会做任何事情。由“加载”事件为类实例提供额外的机制,这些机制可用于我正在查看的目的,在本例中是验证实例。

所以我要做的是改变类的原型并提供一个额外的函数,可以调用该函数来验证已注释的类的实例。

如果有人跟随同一个“思想轨迹”,我的下一个问题是how to pass additional arguments to the decorator

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 2010-09-25
    • 2018-11-26
    • 2018-04-28
    • 2019-08-19
    相关资源
    最近更新 更多