TypeScript无法识别原型扩展装饰器

时间:2016-08-31 23:29:58

标签: typescript prototype decorator

我正在尝试使用TypeScript的experimentalDecorator支持来使用装饰器扩展类的原型。

export function Foo() {
  return function (target) {
     target.prototype.bar = 'baz';
   }
};

虽然看起来这个装饰器适用,但TypeScript并不能识别原型扩展。

@Foo()
class Qux {
   constructor () {
       this.bar; // Property 'style' doesn't exist on type Qux
       console.log(this['bar']); // -> 'baz'
   }
}

有没有办法让TypeScript识别出我所做的这种变化?

1 个答案:

答案 0 :(得分:2)

目前无法做到这一点。有人向make type system aware of decorators提出建议,有些人在评论中说这很难实施。

在同一个主题中,您可以找到使用界面合并的类型检查的建议解决方法。首先,声明一个接口,描述decorator添加的所有属性(它可以与装饰器具有相同的名称):

interface Foo {
    bar: String
}

然后,对于每个修饰的类,您声明一个具有相同名称的接口,该接口与用于类型检查的类合并,并且typescript假定该接口在其他地方实现:

interface Qux extends Foo {}

@Foo()
class Qux {
    constructor () {
        console.log(this.bar); // -> 'baz'
    }
}