การสร้างเครื่องมือตรวจสอบโค้ดอย่างง่าย
สร้างเครื่องมือวินิจฉัยแบบกำหนดเองด้วย API ของคอมไพเลอร์
การสร้างเครื่องมือตรวจสอบโค้ดอย่างง่าย เป็นบทเรียน TypeScript Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน TypeScript Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 4 บทเรียน
เครื่องมือตรวจสอบโค้ดคืออะไร
เครื่องมือตรวจสอบโค้ดจะวิเคราะห์โค้ดต้นฉบับเพื่อรายงานปัญหาด้านรูปแบบหรือความถูกต้อง การใช้ API ของคอมไพเลอร์ TypeScript ช่วยให้คุณสร้าง rules ที่คำนึงถึงชนิดข้อมูล ซึ่งปลั๊กอินของ ESLint ไม่สามารถทำได้ด้วยตัวเอง
// Goal: warn when console.log is called in TypeScript filesการตั้งค่าโครงการ
สร้างสคริปต์ Node.js ที่โหลด program ของ TypeScript สำรวจ AST และรายงานข้อมูลวินิจฉัย
import ts from "typescript";
import path from "path";
const files = ["src/index.ts"];
const program = ts.createProgram(files, { strict: true });การกำหนด rule
rule คือฟังก์ชันที่รับโหนด AST และส่งคืนข้อความวินิจฉัยที่อาจมีค่า หากมีการละเมิด rule
type Diagnostic = { file: string; line: number; message: string };
function noConsoleLog(node: ts.Node, sf: ts.SourceFile): Diagnostic | null {
if (!ts.isCallExpression(node)) return null;
const expr = node.expression.getText(sf);
if (expr !== "console.log") return null;
const { line } = sf.getLineAndCharacterOfPosition(node.pos);
return { file: sf.fileName, line: line + 1, message: "No console.log allowed" };
}การเดินสำรวจ AST
เขียน walk แบบเรียกซ้ำที่นำ rules ทั้งหมดไปใช้กับทุกโหนดในไฟล์ต้นฉบับแต่ละไฟล์
function walk(
node: ts.Node,
sf: ts.SourceFile,
rules: ((n: ts.Node, sf: ts.SourceFile) => Diagnostic | null)[]
): Diagnostic[] {
const diags: Diagnostic[] = [];
for (const rule of rules) {
const d = rule(node, sf);
if (d) diags.push(d);
}
ts.forEachChild(node, child => diags.push(...walk(child, sf, rules)));
return diags;
}การเรียกใช้เครื่องมือตรวจสอบโค้ด
วนซ้ำผ่านไฟล์ต้นฉบับทั้งหมด ใช้ rules และพิมพ์ข้อมูลวินิจฉัย
const rules = [noConsoleLog];
const allDiagnostics: Diagnostic[] = [];
for (const sf of program.getSourceFiles()) {
if (!sf.isDeclarationFile) {
allDiagnostics.push(...walk(sf, sf, rules));
}
}
allDiagnostics.forEach(d =>
console.log(`${d.file}:${d.line} — ${d.message}`)
);การเพิ่ม rule ที่คำนึงถึงชนิดข้อมูล
ใช้ตัวตรวจสอบชนิดเพื่อสร้าง rules ที่ขึ้นอยู่กับชนิด TypeScript ของนิพจน์
const checker = program.getTypeChecker();
function noAnyReturn(node: ts.Node, sf: ts.SourceFile): Diagnostic | null {
if (!ts.isFunctionDeclaration(node)) return null;
const sig = checker.getSignatureFromDeclaration(node);
if (!sig) return null;
const ret = checker.getReturnTypeOfSignature(sig);
if (ret.flags & ts.TypeFlags.Any) {
const { line } = sf.getLineAndCharacterOfPosition(node.pos);
return { file: sf.fileName, line: line + 1, message: "Function returns any" };
}
return null;
}รหัสออกสำหรับการผสานรวมอย่างต่อเนื่อง
ส่งคืน exit code ที่ไม่เป็นศูนย์เมื่อพบข้อมูลวินิจฉัย เพื่อให้กระบวนการผสานรวมอย่างต่อเนื่องทำให้การสร้างล้มเหลว
if (allDiagnostics.length > 0) {
console.error(`${allDiagnostics.length} lint error(s)`);
process.exit(1);
}
process.exit(0);rule: ไม่มีตัวแปรที่ไม่ได้ใช้
API ของคอมไพเลอร์จะแสดงข้อมูลวินิจฉัยเกี่ยวกับตัวแปรที่ไม่ได้ใช้ผ่าน ts.getPreEmitDiagnostics ซึ่งช่วยเสริม rules แบบกำหนดเองด้วยการตรวจสอบในตัว
const preEmit = ts.getPreEmitDiagnostics(program);
preEmit.forEach(d => {
const msg = ts.flattenDiagnosticMessageText(d.messageText, "
");
console.log(msg);
});rule: ต้องระบุชนิดที่ส่งคืน
rule ที่แจ้งเตือนเมื่อฟังก์ชันไม่มีคำอธิบายชนิดที่ส่งคืนอย่างชัดเจน ช่วยบังคับใช้วินัยด้านเอกสาร
function requireReturnType(node: ts.Node, sf: ts.SourceFile): Diagnostic | null {
if (!ts.isFunctionDeclaration(node)) return null;
if (!node.type) {
const { line } = sf.getLineAndCharacterOfPosition(node.pos);
return { file: sf.fileName, line: line + 1, message: "Missing return type" };
}
return null;
}การเปรียบเทียบกับ ESLint
เครื่องมือตรวจสอบโค้ดแบบกำหนดเองของคุณช่วยเสริม ESLint ใช้ ESLint สำหรับ rules ด้านรูปแบบ และใช้เครื่องมือ API ของคอมไพเลอร์ TypeScript สำหรับ rules ที่คำนึงถึงชนิดข้อมูล ซึ่ง ESLint ไม่สามารถแสดงออกได้
// ESLint: stylistic and common pattern rules
// Compiler API linter: deep type reasoning, custom constraintsทบทวน: การสร้างเครื่องมือตรวจสอบโค้ด
เครื่องมือตรวจสอบโค้ดที่ใช้ API ของคอมไพเลอร์ TypeScript จะสร้าง program เดินสำรวจ AST ด้วย rules เรียกดูตัวตรวจสอบชนิดเมื่อจำเป็น และส่งคืน exit code ที่ไม่เป็นศูนย์เมื่อพบข้อผิดพลาด แนวทางนี้ช่วยให้สร้าง rules สำหรับตรวจสอบโค้ดที่เข้าใจชนิดข้อมูลได้อย่างแท้จริง
ตรวจสอบความเข้าใจ
สิ่งใดทำให้เครื่องมือตรวจสอบโค้ดที่ใช้ API ของคอมไพเลอร์มีข้อได้เปรียบเหนือ ESLint
สิ่งที่ได้เรียนรู้
คุณได้สร้างเครื่องมือตรวจสอบโค้ด TypeScript อย่างง่ายโดยใช้ API ของคอมไพเลอร์ ได้แก่ โหลด program เดินสำรวจ AST ใช้ rules (ซึ่งอาจคำนึงถึงชนิดข้อมูล) และรายงานข้อมูลวินิจฉัย นี่คือรากฐานสำหรับการวิเคราะห์แบบสถิตที่กำหนดเองในโครงการ TypeScript ใด ๆ
คำถามที่พบบ่อย
บทเรียน “การสร้างเครื่องมือตรวจสอบโค้ดอย่างง่าย” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสร้างเครื่องมือตรวจสอบโค้ดอย่างง่าย” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส TypeScript Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสร้างเครื่องมือตรวจสอบโค้ดอย่างง่าย”
สร้างเครื่องมือวินิจฉัยแบบกำหนดเองด้วย API ของคอมไพเลอร์ คุณปฏิบัติ TypeScript Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน TypeScript Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน TypeScript Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การสร้างเครื่องมือตรวจสอบโค้ดอย่างง่าย” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน TypeScript Academy นี้ได้ไหม
ได้ บทเรียน TypeScript Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การสร้างโปรแกรม TypeScript ด้วย API
- การท่องผ่าน AST ด้วยตัวเยี่ยมชม
- ตัวแปลงแบบกำหนดเองและการสร้างโค้ด
- การสร้างเครื่องมือตรวจสอบโค้ดอย่างง่าย