【问题标题】:TypeScript: Accessing outer "this" from literal getterTypeScript:从文字 getter 访问外部“this”
【发布时间】:2015-10-27 11:24:12
【问题描述】:

在对象字面量中使用 getter 和 setter 时,我看不到在 Typescript 中访问外部“this”范围的简单方法。考虑以下几点:

class Report {
    stuff: any[];

    options = {
        length: 10,
        get maxLength() { return REPORT.stuff.length }
    }
}

REPORT 希望成为对 Report 对象实例的引用。我意识到我可以通过在构造函数中设置选项并使用var REPORT = this 或类似名称来解决这个问题,但似乎不优雅。有没有办法更干净地做到这一点?

【问题讨论】:

    标签: typescript object-literal


    【解决方案1】:

    我意识到我可以通过在构造函数中设置选项并使用 var REPORT = this 或类似的方法来解决这个问题,但似乎不优雅

    您可以利用 options * 在构造函数中定义的事实,而不是在构造函数中设置选项。因此,将this 存储到options

    class Report {
        stuff: any[] = [];
    
        options = {
            _report: this,
            length: 10,
            get maxLength() { return (this._report as Report).stuff.length }
        }
    }
    
    let foo = new Report(); 
    foo.stuff = [1,2];
    console.log(foo.options.maxLength); // 2
    

    【讨论】:

    • 玩了一下之后,我也得出了这个答案。在我看来,它仍然不完美,但我猜这是我们目前能做的最好的。
    • 需要演员表。但是 self = this 是从测试中遗留下来的……因此现在被删除了,谢谢?
    • @JohnnyHK 没有演员表是any 并且不安全
    【解决方案2】:

    您可以利用 lambda 的 this 绑定。

    class Report {
        stuff: any[];
    
        options = {
            length: 10,
            maxLength: () => this.stuff.length
        }
    }
    

    编译成

    var Report = (function () {
        function Report() {
            var _this = this;
            this.options = {
                length: 10,
                maxLength: function () { return _this.stuff.length; }
            };
        }
        return Report;
    })();
    

    编辑:这会产生一个函数,而不是像你原来那样的 getter。我认为这是一个错字,直到现在我才知道这是有效的 javascript。

    【讨论】:

    • 不幸的是,这不会产生与我的示例相同的对象。我希望 maxLength 是一个 value 属性,在您的示例中,它是一个函数。要访问我的示例中的值,请在您的示例中写入 report.options.maxLength,您需要 report.options.maxLength()
    • @YonaAppletree:今天,我了解到 javascript 具有值属性。我以前没见过他们。我知道胖箭头 lambda 不能被命名,所以我看不到制作这样一个 getter 的优雅方法。
    • 我也刚刚了解了对象字面量中的 getter / setter。我知道您可以使用 Object.defineProperty 对已定义的对象执行此操作,但我不知道它在文字中是否有效。我猜这就是 TypeScript 获得属性方法(或它们实际调用的任何方法)语法的地方。
    猜你喜欢
    • 2017-01-12
    • 2021-07-06
    • 2015-12-18
    • 2021-05-31
    • 2011-02-13
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 2017-06-18
    相关资源
    最近更新 更多