Membina Alat Lint Mudah
Cipta alat diagnostik tersuai menggunakan API penyusun.
Membina Alat Lint Mudah ialah pelajaran TypeScript Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran TypeScript Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus TypeScript Academy merangkumi sejumlah 4 pelajaran.
Apakah Alat Lint?
Alat lint menganalisis kod sumber untuk melaporkan isu gaya atau ketepatan. Dengan menggunakan API penyusun TypeScript, anda boleh membina peraturan yang menyedari jenis, sesuatu yang tidak dapat dicapai oleh pemalam ESLint secara bersendirian.
// Goal: warn when console.log is called in TypeScript filesPersediaan Projek
Cipta skrip Node.js yang memuatkan program TypeScript, menelusuri AST dan melaporkan diagnostik.
import ts from "typescript";
import path from "path";
const files = ["src/index.ts"];
const program = ts.createProgram(files, { strict: true });Menentukan Peraturan
Peraturan ialah fungsi yang menerima nod AST dan mengembalikan mesej diagnostik pilihan jika peraturan tersebut dilanggar.
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" };
}Menelusuri AST
Tulis penelusuran rekursif yang menerapkan semua peraturan pada setiap nod dalam setiap fail sumber.
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;
}Menjalankan Alat Lint
Ulangi semua fail sumber, terapkan peraturan dan cetak diagnostik.
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}`)
);Menambah Peraturan Berasaskan Jenis
Gunakan penyemak jenis untuk membina peraturan yang bergantung pada jenis TypeScript bagi sesuatu ungkapan.
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;
}Kod Keluar untuk CI
Kembalikan kod keluar bukan sifar apabila diagnostik ditemui supaya saluran paip CI boleh menggagalkan binaan.
if (allDiagnostics.length > 0) {
console.error(`${allDiagnostics.length} lint error(s)`);
process.exit(1);
}
process.exit(0);Peraturan: Tiada Pemboleh Ubah Tidak Digunakan
API penyusun mendedahkan diagnostik pemboleh ubah tidak digunakan melalui ts.getPreEmitDiagnostics, lalu melengkapkan peraturan tersuai anda dengan semakan terbina dalam.
const preEmit = ts.getPreEmitDiagnostics(program);
preEmit.forEach(d => {
const msg = ts.flattenDiagnosticMessageText(d.messageText, "
");
console.log(msg);
});Peraturan: Wajibkan Jenis Pulangan
Peraturan yang memberi amaran apabila fungsi tidak mempunyai anotasi jenis pulangan yang jelas membantu menguatkuasakan disiplin pendokumentasian.
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;
}Perbandingan dengan ESLint
Alat lint tersuai anda melengkapi ESLint. Gunakan ESLint untuk peraturan gaya dan alat API penyusun TypeScript anda untuk peraturan berasaskan jenis yang tidak dapat dinyatakan oleh ESLint.
// ESLint: stylistic and common pattern rules
// Compiler API linter: deep type reasoning, custom constraintsRumusan: Membina Alat Lint
Alat lint API penyusun TypeScript melakukan perkara berikut: mencipta program, menelusuri AST dengan peraturan, membuat pertanyaan pilihan kepada penyemak jenis dan keluar dengan kod bukan sifar jika terdapat ralat. Pendekatan ini membolehkan peraturan lint yang benar-benar menyedari jenis.
Semakan Pantas
Apakah yang memberikan kelebihan kepada alat lint API penyusun berbanding ESLint?
Perkara yang Dipelajari
Anda telah membina alat lint TypeScript ringkas menggunakan API penyusun: memuatkan program, menelusuri AST, menerapkan peraturan (dengan kesedaran jenis secara pilihan) dan melaporkan diagnostik. Inilah asas untuk analisis statik tersuai dalam mana-mana projek TypeScript.
Pelajari TypeScript dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 101
- Pelajaran
- 352
Soalan Lazim
Adakah pelajaran “Membina Alat Lint Mudah” percuma?
Ya — teks penuh “Membina Alat Lint Mudah” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus TypeScript Academy, tingkat taraf kepada CoddyKit PRO. Kursus TypeScript Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Membina Alat Lint Mudah”?
Cipta alat diagnostik tersuai menggunakan API penyusun. Anda berlatih TypeScript Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan TypeScript Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran TypeScript Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.
Berapa lamakah pelajaran “Membina Alat Lint Mudah” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran TypeScript Academy ini?
Ya. Setiap pelajaran TypeScript Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Mencipta Program TypeScript dengan API
- Merentasi AST dengan Pelawat
- Pengubah Suai Tersuai dan Penjanaan Kod
- Membina Alat Lint Mudah