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

typescript - ทำไมสมาชิกแบบ static ถึงไม่สามารถเข้าถึงได้ในเมธอดของพร็อพเพอร์ตี้ แต่สามารถใช้งานได้ในเมธอดของ prototype?


มีใครช่วยฉันเข้าใจได้ไหมว่าทำไมถึงเป็นข้อผิดพลาดเมื่อต้องเข้าถึงสมาชิกสแตติกจากเมธอดพร็อพเพอร์ตี้ใน Typescript? มันทำงานได้ปกติใน ES6 ธรรมดาและในฐานะเมธอดพรอทโทไทป์ที่ถูกต้อง

class FooBar {
    static v = 123;

    static foo = () => this.v;  // this is an error in TS (but ok in ES6)

    static bar() {
        return this.v;  // but this is ok in TS??
    }
}

นี่คือข้อผิดพลาด ดูเหมือนว่ามันจะถือว่ารหัสในตัวฟังก์ชันเป็นตัวกำหนดค่าเริ่มต้นของสมบัติเอง:

apptest2.ts:40:24 - error TS2334: 'this' cannot be referenced in a static property initializer.

40     static foo = () => this.v;
                          ~~~~

ความผิดพลาดนี้จะสมเหตุสมผลถ้าโค้ดเป็นประมาณ static foo=this.v แต่การที่มันเป็นส่วนหนึ่งของฟังก์ชันคอลแบ็คไม่สมเหตุสมผลที่จะพิจารณาว่านี่เป็นส่วนหนึ่งของระยะการเริ่มต้นของคลาส ซึ่ง this อาจยังไม่ถูกกำหนด... อย่างไรก็ตาม นั่นก็ใช้ได้ใน ES6 ซึ่งยิ่งทำให้ฉันสับสนว่าทำไมถึงเกิดข้อผิดพลาดนี้และทำไมถึงทำงานใน bar() แต่ไม่ทำงานใน foo().

คำตอบ #1

วันนี้ฉันเจอปัญหานี้ขึ้นมาและฉันสังเกตเห็นสิ่งต่อไปนี้:

ถ้าคุณกำลังใช้ฟังก์ชันลูกศร คุณจำเป็นต้องอ้างอิง ClassName แทน this

class FooBar {
    static v = 123;
    static fooArrow = () => FooBar.v; //works
    static foo () {this.v}; //works
}

ดูเหมือนว่านี่เป็นปัญหาที่ทราบดีใน Typescript และมีการอภิปรายกันมายาวนานเกี่ยวกับการแก้ไขที่เป็นไปได้ ผมคิดว่าควรหลีกเลี่ยงการใช้ฟังก์ชันลูกศรในคลาสไปก่อนเนื่องจากปัญหาเกี่ยวกับวิธีที่บริบท this ถูกผูก

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