TypeScript: الوصول إلى "this" الخارجي من محصل حرفي


عند استخدام الـ getters و setters في الكائنات الحرفية، لا أستطيع أن أرى طريقة سهلة للوصول إلى نطاق الـ "this" الخارجي في TypeScript. انظر المثال التالي:

class Report {
    stuff: any[];

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

حيث يريد REPORT أن يكون مرجعًا إلى نسخة من كائن Report. أدرك أنني أستطيع حل هذا عن طريق ضبط الخيارات داخل المُنشئ واستخدام var REPORT=this أو ما شابه، لكن يبدو ذلك غير أنيق. هل هناك طريقة للقيام بذلك بشكل أنظف؟

الإجابة رقم 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

الإجابة رقم 2

يمكنك الاستفادة من ربط 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 كما كان لديك في الأصل. افترضت أن هذا خطأ مطبعي، حتى الآن فقط، عندما علمت للتو أن هذا يعتبر جافاسكريبت صالح.