สามารถใช้ `this` เมื่อระบุค่าดีฟอลต์ใน TypeScript ได้หรือไม่?
ตัวแปร this อยู่ในขอบเขตของรายการพารามิเตอร์ของเมธอดใน TypeScript หรือไม่?
พิจารณาโค้ดต่อไปนี้:
class Foo {
constructor(public name) {}
bar(str: string = this.name) { console.log(str); }
}
let f = new Foo("Yo");
f.bar();
ค่าปริยายของ str ถูกกำหนดโดยใช้ this ถึงแม้ว่าเราจะไม่ได้อยู่ภายในร่างกายของเมธอดอินสแตนซ์
ปัจจุบัน (ในไทป์สคริปต์ 1.8) สิ่งนี้ทำงานได้เนื่องจากมันถูกแปลงเป็น:
Foo.prototype.bar = function (str) {
if (str === void 0) { str = this.name; }
console.log(str);
};
ดังนั้น this จึงถูกใช้ ภายใน เมธอด แต่สิ่งนี้ถูกระบุว่าจะถูกกฎหมายหรือไม่?
ฉันไม่สามารถหาคำตอบของเรื่องนี้ได้จากการดูสเปคอย่างคร่าว ๆ
หมายเหตุ: สิ่งนี้ไม่ถูกต้องตามกฎหมายใน C++ ซึ่งทำให้ฉันสงสัยว่านี่เป็นฟีเจอร์ที่ตั้งใจไว้หรือเป็นเพียงผลข้างเคียงของกระบวนการแปลงโค้ด
คำตอบ #1
ในส่วน 8.3.1 ตัวพารามิเตอร์ของคอนสตรัคเตอร์ มีการระบุอย่างชัดเจนว่าการใช้ this ในนิพจน์ค่าพารามิเตอร์เริ่มต้นของ constructor เป็นข้อผิดพลาด
ในส่วน 8.4.2 การประกาศฟังก์ชันสมาชิก ไม่มีการกล่าวถึงข้อผิดพลาดใด ๆ เกี่ยวกับการใช้ this ในนิพจน์ค่าปริยายในเมธอดของคลาสปกติ (ที่ไม่ใช่ตัวสร้าง)
มาตรา 6.6 การสร้างรหัสสุดท้ายอธิบายว่ารหัสถูกสร้างในรูปแบบของ:
if (<Parameter> === void 0) { <Parameter> = <Default>; }
Where Parameter คือชื่อของพารามิเตอร์ และ Default คือนิพจน์ค่าพื้นฐาน
กล่าวอีกนัยหนึ่ง ข้อกำหนดปัจจุบันอนุญาตอย่างชัดเจนให้ใช้ this ในนิพจน์ค่าพารามิเตอร์เริ่มต้น ยกเว้นในตัวสร้าง
โค้ดของคุณถูกต้องสมบูรณ์ตามข้อกำหนด
คำตอบ #2
ใช่. มันถูกต้องตามข้อกำหนดของ EcmaScript 6 และ TypeScript transpiler ควรพิจารณามันในลักษณะนั้น.
เนื่องจากอาร์กิวเมนต์เริ่มต้นถูกประเมินผลในเวลาที่เรียกใช้งาน คุณจึงสามารถใช้การเรียกเมทอดและอาร์กิวเมนต์อื่น ๆ ในค่าตั้งต้นได้ด้วย
