声明由TypeScript类装饰器生成的属性的类型?

时间:2017-07-18 21:32:04

标签: javascript typescript ecmascript-6 decorator

我们说我已经宣布以下类在TypeScript中用作装饰器:

class Property {
  static register(...props: Property[]) {
    return function(cls: any) {
      props.forEach(prop => {
        Object.defineProperty(cls.prototype, prop.propertyName, {
          get() {
            return this[`${prop.propertyName}_`] + ' (auto-generated)';
          },
          set(value: any) {
            this[`${prop.propertyName}_`] = value;
          },
        });
      });
    };
  }

  constructor(private readonly propertyName: string) {}
}

当应用于这样的类时:

@Property.register(new Property('myCustomProperty'))
class MyClass {}

结果是一个具有名为myCustomProperty的自动生成的属性setter / getter的类:

const obj = new MyClass();
obj['myCustomProperty'] = 'asdf';
console.info(obj['myCustomProperty_']); // outputs 'asdf'
console.info(obj['myCustomProperty']); // outputs 'asdf (auto-generated)'

不幸的是,TypeScript在编译时似乎没有任何关于此属性的知识,因为它是在运行时生成的。

确保TypeScript识别这些自动生成属性的存在的最佳方法是什么?理想情况下,所有内容都会自动为我生成,因此我不必在其他地方维护任何其他类型。

0 个答案:

没有答案