【问题标题】:Get Class Instance from Within Decorator [duplicate]从装饰器内部获取类实例[重复]
【发布时间】:2016-11-20 09:46:48
【问题描述】:

我试图让我的思想完全围绕装饰器,并且我有几个巧妙的想法可以在我正在处理的回流实现中使用它们。我想用一个动作标记一个商店的类方法,并且任何时候生成该动作,它都知道调用任何带有它标记的方法。

首先,我要标记 Store 方法:

@Action
public setData(data: FakeData) {
    console.log(this);
    this.state.data = data;
}

然后,在动作类中,我想将该方法注册到一个数组中:

class Action {
    private static methods: Method<FakeData>[] = [];

    public static register(method: Method<FakeData>) {
        this.methods.push(method);
    }

    constructor(payload: FakeData);
    constructor(store: Store, method: string);
    constructor(payload: any, method?: string, descriptor?: PropertyDescriptor) {
        if (method) {
            //TODO need actual instance of class here....
            Action.register(payload[method].bind(payload));
            return;
        }

        this.trigger(payload);
    }

    public get payload() {
        return Math.random();
    }

    private trigger(payload: FakeData) {
        Action.methods.forEach(m => m(payload));
    }
}

但是,在构造函数内部,我无法访问商店的实际实例。我能够获得构造函数,但我不确定我是否能够使用它来实现我的目标。也许我应该让所有商店都严格静态而不是构造函数?

我确定我没有以正确的方式考虑这些装饰器,因此感谢任何见解!

Link to full code on Typescript Playground

【问题讨论】:

  • 不清楚你在问什么。虽然可以链接到您的代码,但您也应该始终在问题中发布您的代码
  • 感谢您的反馈。更新以希望使其更清晰。

标签: javascript typescript ecmascript-6 decorator


【解决方案1】:

看起来装饰器是在定义类时调用的,而不是实例化的。这意味着为了让它工作,我必须将所有存储方法设置为静态,并且实例不可访问:

@Action
public static setData(data: FakeData) {
    console.log(this);
    this.state.data = data;
}

完整的工作代码在这里:

Typescript Playground

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 2020-07-08
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多