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

สามารถใช้ `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 ควรพิจารณามันในลักษณะนั้น.

เนื่องจากอาร์กิวเมนต์เริ่มต้นถูกประเมินผลในเวลาที่เรียกใช้งาน คุณจึงสามารถใช้การเรียกเมทอดและอาร์กิวเมนต์อื่น ๆ ในค่าตั้งต้นได้ด้วย

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