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

การตรวจจับความสำเร็จ/ความล้มเหลวด้วย Typescript watcher Compiler API


API ของคอมไพเลอร์ TypeScript อนุญาตให้สร้างคอมไพเลอร์แบบดูแลอัตโนมัติโดยใช้ API ts.createWatchCompilerHost โดยมีตัวอย่างการใช้งานแสดงอยู่ในเอกสารของ TypeScript ที่นี่

API นี้ยอมรับ callback เป็นอาร์กิวเมนต์ตัวสุดท้ายซึ่งจะถูกเรียกทุกครั้งที่สถานะการเฝ้าสังเกตเปลี่ยนไป โดยมีวัตถุ Diagnostic ที่ให้รายละเอียดเกี่ยวกับการเปลี่ยนแปลงสถานะการเฝ้าสังเกต

โดยใช้เหตุการณ์วินิจฉัยเหล่านี้ ฉันกำลังพยายามแยกระหว่างสถานะ compiling, success และ failure ฉันสามารถตรวจจับสถานะ compiling ได้เรียบร้อยแล้ว แต่ฉันเจอความแปลกประหลาดเมื่อพยายามระบุความแตกต่างระหว่าง success และ failure

ปัญหาที่ฉันกำลังเจอเกิดจากข้อเท็จจริงที่ว่ารหัสวินิจฉัยถูกนำไปใช้ดังนี้ หากมีข้อผิดพลาด 1 รายการในระหว่างการสร้าง จะให้รหัส 6193 มิฉะนั้นจะให้รหัส 6194 ซึ่งหมายความว่ารหัส 6194 จะถูกให้หากไม่มีข้อผิดพลาด (ถือว่า success) หรือหากมีข้อผิดพลาด 2 รายการขึ้นไป (ถือว่า failure) คุณสามารถดูตรรกะนี้ในตัวคอมไพเลอร์ ts ได้ที่นี่

วิธีที่คาดหวังสำหรับผู้ใช้ createWatchCompilerHost ในการแยกแยะระหว่างกรณีที่ไม่มีข้อผิดพลาดในการสร้างและกรณีที่มีข้อผิดพลาด 1 ข้อขึ้นไปในการสร้างคืออะไร?

วิธีแก้ปัญหาแบบชั่วคราวคือการแยกวิเคราะห์ diagnostic.messageText เพื่อตรวจสอบ Found 0 errors. แต่ดูเหมือนว่าจะเปราะบางมาก และเป็นวิธีแก้ที่ผม/ฉันต้องการหลีกเลี่ยง

คำตอบ #1

TS 3.7

ใน TypeScript 3.7 ตอนนี้มีพารามิเตอร์ errorCount ใน reportWatchStatusChanged:

function reportWatchStatusChanged(
    diagnostic: Diagnostic,
    newLine: string,
    options: CompilerOptions,
    // I'm not sure why this is nullable, I am asking in the issue
    errorCount?: number
) {
    // check error count here
}

ก่อน TS 3.7

พิจารณาโฮสต์นาฬิกาต่อไปนี้จากตัวอย่าง:

const host = ts.createWatchCompilerHost(
  configPath,
  {},
  ts.sys,
  createProgram,
  reportDiagnostic,
  reportWatchStatusChanged
);

คุณสามารถเพิ่มแฟลกที่ถูกเรียกใช้โดยคอลแบ็ก reportDiagnostic แล้วจากนั้นตรวจสอบและรีเซ็ตแฟลกนั้นใน reportWatchStatusChanged ได้

ตัวอย่างเช่น:

let hadDiagnostics = false;

function reportDiagnostic(diagnostic: ts.Diagnostic) {
  hadDiagnostics = true;
  // ...etc...
}

function reportWatchStatusChanged(diagnostic: ts.Diagnostic) {
  if (hadDiagnostics) {
      console.log("Failed.");
      hadDiagnostics = false;
  } else {
      console.log("Success.");
  }

  // ...etc...
}