Javascript 通过类装饰器自动将类添加到列表中?

Javascript 通过类装饰器自动将类添加到列表中?,javascript,decorator,Javascript,Decorator,有可能在装饰器中获得“类对象”(构造函数)的句柄吗 背景:我想用带有类型标记的字符串值解析json格式,例如“@date:2019-01-25”或“@latlong:51.507351,-0127758” 这是旧js库的现代化工作,在旧js库中,这是通过重写子类化和实例创建来实现的 装饰器看起来很有前途,至少我可以将标记定义为类属性: function dkdatatype({tag}) { return function decorator(cls) { if (cls

有可能在装饰器中获得“类对象”(构造函数)的句柄吗

背景:我想用带有类型标记的字符串值解析json格式,例如
“@date:2019-01-25”
“@latlong:51.507351,-0127758”

这是旧js库的现代化工作,在旧js库中,这是通过重写子类化和实例创建来实现的

装饰器看起来很有前途,至少我可以将标记定义为类属性:

function dkdatatype({tag}) {
    return function decorator(cls) {
        if (cls.kind !== 'class') throw `not class ${cls.kind}`;

        cls.elements.push({
            kind: 'field',
            key: 'tag',
            placement: 'static', 
            descriptor: {
                configurable: false,
                enumerable: true,
                writable: false
            },
            initializer: () => tag
        });

        return {
            kind: 'class',
            elements: cls.elements
        };
    };
}

@dkdatatype({tag: '@date:'})
export class DkDate extends datatype {
    constructor(...args) {
        super();
        const clstag = this.constructor.tag;
        if (typeof args[0] === 'string' && args[0].startsWith(clstag)) {
            this.value = new Date(args[0].substr(clstag.length));
        } else {
            this.value = new Date(...args);
        }
    }
    toJSON() {
        return this.constructor.tag + this.value.toISOString().slice(0, 10);
    }
}
我可以手动将该类添加到类型注册表:

type_registry[DkDate.tag] = DkDate
但是有没有任何方法可以从decorator(或者基类,或者其他一些方法)自动(并且仅一次)执行此操作呢?

根据,您希望向decorator返回的类描述符添加一个
extras
属性,该类描述符应该包含一个“钩子”描述符,该描述符应该有一个
finish
方法,一旦类被完全定义,该方法将作为参数与类一起调用

下面是示例代码:

function defineElement(tagName) {
  return function(classDescriptor) {
    let { kind, elements } = classDescriptor;
    assert(kind == "class");
    return {
      kind,
      elements,

      // This callback is called once the class is otherwise fully defined
      extras: [
        {
          kind: "hook",
          placement: "static",
          finish(klass) {
            window.customElements.define(tagName, klass);
          }
        }
      ]
    };
  };
在您的情况下,
extras
将如下所示:

extras: [
  {
    kind: "hook",
    placement: "static",
    finish(klass) {
      type_registry[tag] = klass;
    },
  },
],

使用
@babel/plugin-proposal-decorators
7.3.0,我得到了
TypeError:类描述符不能有.extras属性。
经过多次搜索,我找到了这个(),并添加了
finisher(cls){type_-registry[tag]=cls;}
而不是
extras:..
似乎可以工作(即使它已从中的文档中删除)。我想这就是最前沿的生活……看起来它现在正在进行中:挖掘得好。