0Pricing
TypeScript Academy · บทเรียน

การสร้างเครื่องมือตรวจสอบโค้ดอย่างง่าย

สร้างเครื่องมือวินิจฉัยแบบกำหนดเองด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การสร้างโปรแกรม TypeScript ด้วย API
  2. การท่องผ่าน AST ด้วยตัวเยี่ยมชม
  3. ตัวแปลงแบบกำหนดเองและการสร้างโค้ด
  4. การสร้างเครื่องมือตรวจสอบโค้ดอย่างง่าย
← กลับไปที่ TypeScript Academy