0Pricing
TypeScript Academy · درس

بناء أداة تدقيق بسيطة

أنشئوا أداة تشخيص مخصّصة باستخدام Compiler API

بناء أداة تدقيق بسيطة درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

ما أداة تدقيق الشيفرة؟

تحلل أداة تدقيق الشيفرة المصدرية للإبلاغ عن مشكلات التنسيق أو الصحة. ويتيح استخدام واجهة برمجة تطبيقات مترجم TypeScript بناء قواعد تراعي الأنواع، وهي أمور لا تستطيع مكوّنات ESLint الإضافية تحقيقها بمفردها.

// Goal: warn when console.log is called in TypeScript files

إعداد المشروع

أنشئوا سكربت Node.js يحمّل برنامج TypeScript، ويجتاز AST، ويُبلغ عن التشخيصات.

import ts from "typescript";
import path from "path";

const files = ["src/index.ts"];
const program = ts.createProgram(files, { strict: true });

تعريف قاعدة

القاعدة هي دالة تستقبل عقدة AST وتعيد رسالة تشخيصية اختيارية إذا جرت مخالفة القاعدة.

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

اكتبوا اجتيازًا递ّيًا يطبّق جميع القواعد على كل عقدة في كل ملف مصدر.

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;
}

تشغيل أداة التدقيق

كرّروا على جميع ملفات المصدر، وطبّقوا القواعد، واطبعوا التشخيصات.

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}`)
);

إضافة قاعدة تراعي النوع

استخدموا مدقق الأنواع لبناء قواعد تعتمد على نوع 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;
}

رمز الخروج لـ CI

أعيدوا رمز خروج غير صفري عند العثور على تشخيصات، حتى تتمكن مسارات CI من إفشال عملية البناء.

if (allDiagnostics.length > 0) {
  console.error(`${allDiagnostics.length} lint error(s)`);
  process.exit(1);
}
process.exit(0);

قاعدة: منع المتغيرات غير المستخدمة

توفّر واجهة برمجة تطبيقات المصرّف تشخيصات المتغيرات غير المستخدمة عبر ts.getPreEmitDiagnostics، مما يضيف فحوصات مضمّنة إلى قواعدكم المخصصة.

const preEmit = ts.getPreEmitDiagnostics(program);
preEmit.forEach(d => {
  const msg = ts.flattenDiagnosticMessageText(d.messageText, "
");
  console.log(msg);
});

قاعدة: اشتراط أنواع الإرجاع

تساعد قاعدة تحذّر عند افتقار الدوال إلى تعريفات صريحة لنوع الإرجاع على فرض الانضباط في التوثيق.

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 لقواعد التنسيق، وأداة واجهة برمجة تطبيقات مترجم TypeScript للقواعد التي تراعي الأنواع ولا يستطيع ESLint التعبير عنها.

// ESLint: stylistic and common pattern rules
// Compiler API linter: deep type reasoning, custom constraints

مراجعة: بناء أداة تدقيق

تتضمن أداة تدقيق مبنية على واجهة برمجة تطبيقات مترجم TypeScript إنشاء برنامج، واجتياز AST باستخدام القواعد، والاستعلام اختياريًا عن مدقق الأنواع، ثم الخروج برمز غير صفري عند وجود أخطاء. يتيح هذا النهج إنشاء قواعد تدقيق تراعي الأنواع فعليًا.

تحقق سريع

ما الذي يمنح أداة التدقيق المبنية على واجهة برمجة تطبيقات المصرّف ميزة على ESLint؟

ما تعلمتموه

بنيتم أداة تدقيق بسيطة لـ TypeScript باستخدام واجهة برمجة التطبيقات الخاصة بالمصرّف: حمّلوا برنامجًا، واجتازوا AST، وطبّقوا القواعد مع إمكانية مراعاة الأنواع، وأبلغوا عن التشخيصات. يشكّل هذا أساس التحليل الساكن المخصص في أي مشروع TypeScript.

الأسئلة الشائعة

هل درس «بناء أداة تدقيق بسيطة» مجاني؟

نعم — نص درس «بناء أداة تدقيق بسيطة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

ماذا ستتعلم في «بناء أداة تدقيق بسيطة»؟

أنشئوا أداة تشخيص مخصّصة باستخدام Compiler API تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟

لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «بناء أداة تدقيق بسيطة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟

نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. إنشاء برنامج TypeScript باستخدام API
  2. اجتياز AST باستخدام الزوّار
  3. المحوّلات المخصّصة وتوليد الشيفرة
  4. بناء أداة تدقيق بسيطة
← العودة إلى TypeScript Academy