ข้อผิดพลาดของ TypeScript ที่แปลก: "ชื่อ g ไม่มีอยู่ในขอบเขตปัจจุบัน"
จู่ ๆ โค้ดของฉันก็คอมไพล์ไม่ได้และ tsc บ่นว่า "ชื่อ g ไม่มีอยู่ในสโคปปัจจุบัน" นี่คือข้อผิดพลาดที่ตลกจริง ๆ:
- ไม่มีตัวแปร คลาส หรืออินเทอร์เฟซชื่อ "g" ใด ๆ ในโค้ดของฉัน
- ฉันไม่ได้นำเข้ามอดูลที่ชื่อว่า "g"
- ไฟล์เองไม่ได้ถูกตั้งชื่อว่า "g"
นี่คือโค้ดบางส่วน:
export class SpawnMessage implements Message {
tag: UID;
id: number;
}
VisualStudio ขีดเส้นใต้ตัว "e" ของคำว่า "export" เป็นสีแดงและบ่นว่า "ไม่มีชื่อ g" ข้อความแสดงข้อผิดพลาดเดียวกันนี้ปรากฏอยู่ทั่วโค้ดของฉันในตำแหน่งที่แปลกประหลาดที่สุด
ก็ผมคิดว่าถ้า g สำคัญขนาดนั้น ผมก็แค่สร้างมันขึ้นมา ผมเพิ่มตัวแปรชื่อ g ไว้ด้านบนของโค้ดของผม ข้อความแสดงข้อผิดพลาดไม่ได้หายไป มันแค่ย้ายที่ไป ตัวอย่างเช่น ตอนนี้หนึ่งในความคิดเห็นของผมดูเหมือนจะผิดจริง ๆ ผมคงไม่เชื่อเรื่องนี้ถ้ามีคนบอกผม ดังนั้นผมจึงถ่ายหน้าจอไว้: ![g does not exist][1]
มันไม่ได้เกิดขึ้นเฉพาะกับ VisualStudio แต่กับ tsc ด้วย ฉันรีสตาร์ท IDE และเชลล์แล้ว แต่ข้อผิดพลาดยังคงอยู่ ตามธรรมชาติ มันก็ย้ายไปที่อื่นอีกครั้ง
เกิดอะไรขึ้นผิดพลาด?
อัพเดต: ฉันแก้ไขคำสั่งส่งออกและนำเข้าข้อมูลแล้ว แต่ก็ไม่ได้ส่งผลต่อข้อผิดพลาด นี่คือไฟล์ทั้งหมดบน jsfiddle โค้ดค่อนข้างยุ่งเหยิง โปรดเข้าใจว่านี่เป็นงานที่กำลังดำเนินการ อยู่จริง ๆ แล้วฉันเพิ่งทำการปรับโค้ดใหม่เมื่อข้อผิดพลาดปรากฏขึ้นและยังไม่ได้แตะต้องไฟล์นี้ตั้งแต่นั้น
http://jsfiddle.net/JT36W/
ตอนนี้พบข้อผิดพลาดในสามจุดนี้:
- วงเล็บปีกกาปิดของอินเตอร์เฟซ
Message - เครื่องหมายเท่ากับในบรรทัดสุดท้ายของคอนสตรักเตอร์ของ
SpawnMessage - มีช่องว่างบางส่วนด้านหน้าประโยค return ของเมธอด
requestSpawnในคลาสGame
อัปเดต 2: ผมได้รีสตาร์ททั้ง VisualStudio และ command prompt ข้อผิดพลาดก็ยังคงอยู่ จากนั้นผมได้รีสตาร์ทคอมพิวเตอร์ ข้อผิดพลาดก็ยังอยู่ คุณจะเห็นว่าผมสิ้นหวังสุด ๆ นั่นคือเหตุผลที่ผมผลักทุกอย่างไปที่ GitHub ลบสำเนาท้องถิ่นของผมและโคลนรีโปใหม่ ข้อผิดพลาดหายไป มันคือโค้ดเดียวกันเป๊ะ คอมไพเลอร์เดียวกันเป๊ะ และแม้แต่เส้นทางในไดรฟ์ก็เหมือนกัน แต่ tsc กลับคอมไพล์โค้ดได้
ฉันจะไม่โพสต์นี่เป็นคำตอบของคำถามตัวเอง เพราะมันไม่ค่อยน่าพอใจ หากมีใครสักคนอธิบายพฤติกรรมแปลกๆ นี้ได้ บางทีอาจจะเป็นบั๊กที่รู้จักกันอยู่ ฉันยินดีที่จะยอมรับคำตอบของเขา
คำตอบ #1
ฉันเชื่อว่าฉันเคยเจอข้อผิดพลาดนี้มาบ้างแล้ว ครั้งก่อนที่มันพูดถึง "g" หรือ "b" มันหมายถึงโซ่การสืบทอดโปรโตไทป์ภายในที่มันเก็บไว้สำหรับคลาสของคุณ สำหรับฉัน ข้อผิดพลาดนี้หรืออะไรที่คล้ายกันจะเกิดขึ้นเมื่อคลาสฐาน Message ถูกกำหนดหลังจากคลาสลูก SpawnMessage ในลำดับโค้ด เพียงแค่กำหนดคลาสฐานก่อน
หวังว่าจะช่วยได้นะ