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 ถูกผูก
