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

ข้อผิดพลาดของ 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/

ตอนนี้พบข้อผิดพลาดในสามจุดนี้:

  1. วงเล็บปีกกาปิดของอินเตอร์เฟซ Message
  2. เครื่องหมายเท่ากับในบรรทัดสุดท้ายของคอนสตรักเตอร์ของ SpawnMessage
  3. มีช่องว่างบางส่วนด้านหน้าประโยค return ของเมธอด requestSpawn ในคลาส Game

อัปเดต 2: ผมได้รีสตาร์ททั้ง VisualStudio และ command prompt ข้อผิดพลาดก็ยังคงอยู่ จากนั้นผมได้รีสตาร์ทคอมพิวเตอร์ ข้อผิดพลาดก็ยังอยู่ คุณจะเห็นว่าผมสิ้นหวังสุด ๆ นั่นคือเหตุผลที่ผมผลักทุกอย่างไปที่ GitHub ลบสำเนาท้องถิ่นของผมและโคลนรีโปใหม่ ข้อผิดพลาดหายไป มันคือโค้ดเดียวกันเป๊ะ คอมไพเลอร์เดียวกันเป๊ะ และแม้แต่เส้นทางในไดรฟ์ก็เหมือนกัน แต่ tsc กลับคอมไพล์โค้ดได้

ฉันจะไม่โพสต์นี่เป็นคำตอบของคำถามตัวเอง เพราะมันไม่ค่อยน่าพอใจ หากมีใครสักคนอธิบายพฤติกรรมแปลกๆ นี้ได้ บางทีอาจจะเป็นบั๊กที่รู้จักกันอยู่ ฉันยินดีที่จะยอมรับคำตอบของเขา

คำตอบ #1

ฉันเชื่อว่าฉันเคยเจอข้อผิดพลาดนี้มาบ้างแล้ว ครั้งก่อนที่มันพูดถึง "g" หรือ "b" มันหมายถึงโซ่การสืบทอดโปรโตไทป์ภายในที่มันเก็บไว้สำหรับคลาสของคุณ สำหรับฉัน ข้อผิดพลาดนี้หรืออะไรที่คล้ายกันจะเกิดขึ้นเมื่อคลาสฐาน Message ถูกกำหนดหลังจากคลาสลูก SpawnMessage ในลำดับโค้ด เพียงแค่กำหนดคลาสฐานก่อน

หวังว่าจะช่วยได้นะ