Javascript TypeScript装饰程序无法识别新属性

Javascript TypeScript装饰程序无法识别新属性,javascript,typescript,Javascript,Typescript,假设我有一个类装饰器,它向类添加了一些方法 function decorator(target) { target.prototype.method = function() {}; } @decorator class Test { constructor() { this.method() <------- Property method does not exists on type Test } } 函数装饰器(目标){ target.prototype

假设我有一个类装饰器,它向类添加了一些方法

function decorator(target) {
  target.prototype.method = function() {};
}


@decorator
class Test {
  constructor() {
    this.method()  <------- Property method does not exists on type Test
  }
}
函数装饰器(目标){
target.prototype.method=function(){};
}
@装饰师
课堂测试{
构造函数(){

此.method()decorator用于各种原因,从修改类到面向方面的编程,再到简单的日志记录。几乎任何事情都可能发生在decorator内部。此时,decorator的内容不用于修改类的类型信息(在某些情况下,可能永远不可能这样做,但在您的情况下,这是可能的,因为这是一个非常简单的问题)

如果您想将方法添加到类中,则可以将其视为替代或简单继承(见下文)。 占位符实现 解决此问题的一个简单方法是提供一个空方法来生成所需的类型信息:

@decorator
class Test {
  constructor() {
      this.method();
    }

    method(): void { }
}
替换构造函数 另一种解决方案是替换decorator中的构造函数——因此您可以在decorator中添加方法,以及对方法的构造函数调用——从而确保实现在那里

function decorator(target: any) {
    const original = target;

    const constr: any = (...args) => {
        const c: any = () => {
            return original.apply(null, args);
        }

        c.prototype = original.prototype;
        c.prototype.method = function () { alert('method');};

        const inst = new c();
        inst.method();
        return inst;
    }

    constr.prototype = original.prototype;

    return constr;

}

@decorator
class Test {
    constructor() {
    }
}

const test = new Test();
遗产 这是一个枯燥但通常是正确的解决方案(如果您不想继承,可以委托):


从修改类到面向方面编程,再到简单的日志记录,decorator的使用有各种各样的原因。几乎任何事情都可能发生在decorator内部。此时,decorator的内容不用于修改类的类型信息(在某些情况下,可能永远不可能这样做,但在您的情况下,这是可能的,因为这是一个非常简单的问题)

如果您想将方法添加到类中,则可以将其视为替代或简单继承(见下文)。 占位符实现 解决此问题的一个简单方法是提供一个空方法来生成所需的类型信息:

@decorator
class Test {
  constructor() {
      this.method();
    }

    method(): void { }
}
替换构造函数 另一种解决方案是替换decorator中的构造函数——因此您可以在decorator中添加方法,以及对方法的构造函数调用——从而确保实现在那里

function decorator(target: any) {
    const original = target;

    const constr: any = (...args) => {
        const c: any = () => {
            return original.apply(null, args);
        }

        c.prototype = original.prototype;
        c.prototype.method = function () { alert('method');};

        const inst = new c();
        inst.method();
        return inst;
    }

    constr.prototype = original.prototype;

    return constr;

}

@decorator
class Test {
    constructor() {
    }
}

const test = new Test();
遗产 这是一个枯燥但通常是正确的解决方案(如果您不想继承,可以委托):


如果我们添加新道具,我希望typescript添加类型。如果我们添加新道具,我希望typescript添加类型。