ค้นหาเว็บไซต์

การสร้างตัวแปรพร้อม get/set ภายในโมดูลใน Typescript


ฉันต้องการสร้างตัวแปรที่มีคุณสมบัติ get/set ภายในโมดูล ฉันเห็นตัวอย่างที่ใช้งานได้สำหรับการสร้างคุณสมบัติ get/set ภายในคลาสที่มีลักษณะดังนี้:

class MyClass {
    private view;
    get View() { return this.view; }
    set View(value) { this.view = value }
}

แต่ฉันต้องการทำสิ่งเดียวกันภายในโมดูล:

module MyModule {
    export var view;
    //I want to create get/set methods for view property here
}

ฉันจะทำอย่างนั้นได้อย่างไร?

คำตอบ #1

ฉันคิดว่ามันน่าจะเป็นเพียงความบังเอิญ; ฉันจะนำเรื่องนี้ไปคุยกับทีมออกแบบ (ฉันไม่เห็นเหตุผลที่ชัดเจนว่าทำไมมันถึงถูกห้าม นอกจากว่า 'เรายังไม่ได้ทำการใช้งาน') มันค่อนข้างง่ายในการหาทางแก้ปัญหาเมื่อภาษายังไม่มีการสนับสนุนโดยตรงสำหรับมัน:

module Bar {
    var _qua = 42;

    declare export var qua: number;
    Object.defineProperty(Bar, 'qua', {
        get: function() { return _qua; },
        set: function(value) { _qua = value; }
    }); 
}

// Works
var x = Bar.qua;
console.log(x);
Bar.qua = 19;
console.log(Bar.qua);

คำตอบ #2

Accessor ใช้สำหรับ "สมาชิก" เท่านั้น สมาชิกสามารถเป็นส่วนหนึ่งของคลาสได้เท่านั้น อย่างน้อยนี่คือวิธีของ TypeScript

Accessor ถูกกำหนดไว้บนโปรโตไทป์ของคลาส ซึ่งเป็นสิ่งที่โมดูลไม่มี หากคุณต้องการจริงๆ คุณสามารถกำหนดมันด้วยตนเอง และมันก็ใช้งานได้

module MyModule {
    var view;
    export var View;
    Object.defineProperty(MyModule, "View", {
        get: function () {
            console.log(1);
            return view;
        },
        set: function (val) {
            console.log(2, val);
            view = val;
        },
        enumerable: true,
        configurable: true
    });
}

MyModule.View = 555;
window["mm"] = MyModule.View;

ตามที่คาดไว้ ฉันได้รับผลลัพธ์ของ:

> 2 555
> 1

ถึงฉันจะไม่จริงๆ :)

บทความที่เกี่ยวข้อง