【问题标题】:typescript class decorator can not access static value if decorator return as high order function如果装饰器作为高阶函数返回,打字稿类装饰器无法访问静态值
【发布时间】:2018-06-16 12:34:04
【问题描述】:

这是一个演示:

function Bar(FooClass: Foo) {
  console.log('in Bar decorator');

  return function (args) {
    console.log('in Bar high order function: ', args);
    let foo = new FooClass();
  }
}

@Bar
class Foo {

  a = 1;
  static b = 2;

  constructor(args) {
    console.log('in Foo constructor')
    console.log('Foo instance a: ', this.a);
    console.log('Foo static b: ', Foo.b);
  }
}

new Foo(123);

当我编译并运行代码时,它会打印:

in Bar decorator
in Bar high order function:  123
in Foo constructor
Foo instance a:  1
Foo static b:  undefined

我知道我可以通过FooClass.b 访问高阶函数中的静态值b。但在Foo的实例中似乎无法访问它。

【问题讨论】:

  • 您的代码无法编译

标签: typescript decorator


【解决方案1】:

装饰器的工作方式是,如果你从装饰器返回一个值,它将替换被装饰的类。您返回的函数可以成功替换Foo,但由于它不继承原始Foo 的属性,因此在替换后的Foo 上将不可用。

最简单的解决方案是返回一个派生自传递给装饰器的类的匿名类。

function Bar(FooClass: typeof Foo) {
    console.log('in Bar decorator');
    return class extends FooClass {
        constructor(args: any) {
            super(args);
            console.log('in Bar high order function: ', args);
        }
    };
}

@Bar
class Foo {

    a = 1;
    static b = 2;
    constructor(args: any) {
        console.log('in Foo constructor')
        console.log('Foo instance a: ', this.a);
        console.log('Foo static b: ', Foo.b);
    }
}

new Foo(123);

【讨论】:

  • 谢谢,你拯救了我的一天!
猜你喜欢
  • 2020-01-02
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 2020-05-02
  • 1970-01-01
  • 2017-04-02
  • 2015-12-12
相关资源
最近更新 更多