Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为TypeScript类装饰器生成的属性声明类型?_Javascript_Typescript_Ecmascript 6_Decorator - Fatal编程技术网

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

Javascript 为TypeScript类装饰器生成的属性声明类型?,javascript,typescript,ecmascript-6,decorator,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() { re

假设我声明了以下类在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识别这些自动生成属性的存在的最佳方法是什么?理想情况下,所有内容都将为我自动生成,这样我就不必在其他地方维护任何额外的类型。

是的,我访问带下划线的类型只是为了演示。我只想访问非下划线的那个,我想知道是否有可能为此生成一个类型。或者可能有不同的方法?谢谢你的回复。是的,带下划线的属性只是一个用于说明的实现细节。它们与这个问题并不真正相关。但你几乎回答了我的问题。我在想,也许有一种方法,我可以调整一些东西,并使用mixin来代替。。。但我还没有真正考虑过这个选项。你为什么要把
Property
作为一个类<代码>寄存器很容易成为一个简单的函数,将字符串作为参数。@Bergi代码如下:@AlexLockwood好的,将对象作为参数传递可能有意义,因为您有多个属性,但这些“方法”目前都不能被证明是实例方法。它们不使用此,它们本质上是静态的。如果不将
propertyName
作为参数,而是使用instance属性,那么它们是有意义的。另外,我认为如果您有一个实例方法
createPropertyDescriptor
,该方法返回一个带有相应
set
get
函数的对象,而不是从getter/setter调用
model
方法,那么代码会简化一点。