การตรวจจับความสำเร็จ/ความล้มเหลวด้วย 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...
}
