我正在尝试使用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识别出我所做的这种变化?
答案 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'
}
}