CodeBlanks Logo Icon CodeBlanks

Özet - Custom type checker

Özel bir kural denetleyici yazarsın.

Mini type checker

Bir mini type checker üç parçayı birleştirir: ts.forEachChild ile AST'yi gezer, ts.isVariableDeclaration gibi koruyucularla ilgilendiğin düğümleri tanır, ts.getLineAndCharacterOfPosition ile ihlalin konumunu raporlar. Hataları bir dizide toplar, en sonunda yazdırırsın.

function visit(node: ts.Node) {
  if (ts.isVariableDeclaration(node) && !node.type) {
    const { line } = ts.getLineAndCharacterOfPosition(sf, node.getStart(sf));
    errors.push(`line ${line + 1}: missing type`);
  }
  ts.forEachChild(node, visit);
}

Uygulama Türü eksik değişkenleri raporla

Her biri ayrı satırda olmak üzere üç değişken içeren bir kaynak oluştur: let x = 1;, let y: string = "a"; ve let z = true;. visit fonksiyonu yaz: tür eklemesi olmayan VariableDeclaration düğümlerini bul, satır numarasıyla line N: missing type biçiminde hatayı listeye topla. ts.forEachChild ile gez ve sonuçları her satırda bir tane olacak biçimde yazdır.

Başlangıç kodu

index.ts
import * as ts from "typescript";

// Üç satırlık kaynak: let x = 1; / let y: string = "a"; / let z = true;
// SourceFile oluştur
// visit fonksiyonu yaz: Tür eklemesi olmayan VariableDeclaration bul
// Satır numarasıyla line N: missing type biçiminde topla
// forEachChild ile gez
// Hataları her satırda bir tane olarak yazdır

// kodunu buraya yaz

Örnek çözüm

index.ts
import ts from "typescript";

const sourceText = 'let x = 1;\nlet y: string = "a";\nlet z = true;';
const sf = ts.createSourceFile("app.ts", sourceText, ts.ScriptTarget.Latest, true);

const errors: string[] = [];
function visit(node: ts.Node) {
  if (ts.isVariableDeclaration(node) && !node.type) {
    const { line } = ts.getLineAndCharacterOfPosition(sf, node.getStart(sf));
    errors.push(`line ${line + 1}: missing type`);
  }
  ts.forEachChild(node, visit);
}
visit(sf);
console.log(errors.join("\n"));

Beklenen çıktı

line 1: missing type
line 3: missing type

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Mini type checker için hangi üçlü bir araya gelir?

  • getTypeChecker + writeFile + readFile
  • forEachChild + isVariableDeclaration + getLineAndCharacterOfPosition Doğru cevap
  • getSourceFile + getText + console.log
  • createSourceFile + JSON.stringify + writeFile

Açıklama: forEachChild ile AST gezilir, isVariableDeclaration ile düğüm tanınır, getLineAndCharacterOfPosition ile konum raporlanır. Bu üç birlikte mini checker oluşturur.

2 Düğüm başlangıcı

Soru
const start = node.____(sf);
Cevap
const start = node.getStart(sf);

Açıklama: node.getStart(sf) düğümün başlangıç offsetini döndürür; getOffset, getPos ve getStartPosition diye yöntemler Node üzerinde yoktur.

3 Mini checker özeti

Kavram Anlamı
ts.forEachChild AST'yi gezer
ts.isVariableDeclaration Düğüm türünü tanır
node.getStart Başlangıç offsetini verir
getLineAndCharacterOfPosition Satır numarası verir

Uzman bölümündeki tüm dersler