Meydan okuma 1: Compiler API
- TypeScript kursu
- Uzman
- Ders 32/35
- 6 dk
Compiler API ile bir analiz görevi çözersin.
Compiler API ile analiz
Bu meydan okumada Compiler API ile bir kaynak dosyayı analiz edeceksin. ts.createSourceFile ile kaynağı parse et, ts.forEachChild ile AST'yı gez, ts.isFunctionDeclaration ile fonksiyonları tanı. Fonksiyonların parametre sayılarını ve adlarını çıkaracaksın.
Uygulama Parametre sayılarını topla
function a(x: number) {} function b(y: string, z: number) {} kaynağından bir SourceFile oluştur. visit fonksiyonu yaz: her FunctionDeclaration'ın parametre sayısını topla. ts.forEachChild ile gez ve toplamı yazdır.
Başlangıç kodu
import * as ts from "typescript";
// Kaynak: function a(x: number) {} function b(y: string, z: number) {}
// SourceFile oluştur
// visit fonksiyonu yaz: FunctionDeclaration bul
// Her fonksiyonun parametre sayısını topla
// forEachChild ile gez
// Toplamı yazdır
// kodunu buraya yazÖrnek çözüm
import ts from "typescript";
const sourceText = "function a(x: number) {} function b(y: string, z: number) {}";
const sf = ts.createSourceFile("app.ts", sourceText, ts.ScriptTarget.Latest, true);
let total = 0;
function visit(node: ts.Node) {
if (ts.isFunctionDeclaration(node)) {
total += node.parameters.length;
}
ts.forEachChild(node, visit);
}
visit(sf);
console.log(total);Beklenen çıktı
3
Uygulama Fonksiyon adlarını listele
function topla() {} function cikar() {} kaynağından bir SourceFile oluştur. visit fonksiyonu yaz: her FunctionDeclaration'ın adını node.name.text ile al ve yazdır. ts.forEachChild ile gez.
Başlangıç kodu
import * as ts from "typescript";
// Kaynak: function topla() {} function cikar() {}
// SourceFile oluştur
// visit fonksiyonu yaz: FunctionDeclaration bul
// Her fonksiyonun adını yazdır
// forEachChild ile gez
// kodunu buraya yazÖrnek çözüm
import ts from "typescript";
const sourceText = "function topla() {} function cikar() {}";
const sf = ts.createSourceFile("app.ts", sourceText, ts.ScriptTarget.Latest, true);
function visit(node: ts.Node) {
if (ts.isFunctionDeclaration(node) && node.name) {
console.log(node.name.text);
}
ts.forEachChild(node, visit);
}
visit(sf);Beklenen çıktı
topla cikar
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Bir FunctionDeclaration'ın parametre sayısına nasıl erişilir?
- node.arguments.length
- node.parameters.length Doğru cevap
- node.params.length
- node.args.length
Açıklama: FunctionDeclaration.parameters bir ReadonlyArray<ParameterDeclaration>'dır; length ile sayısı alınır. params, args veya arguments özellikleri yoktur.
2 Fonksiyon adını al
if (ts.isFunctionDeclaration(node) && node.name) {
console.log(node.name.____);
}
if (ts.isFunctionDeclaration(node) && node.name) {
console.log(node.name.text);
}
Açıklama: Identifier.text tanımlayıcının yazısal değerini verir; value, name ve key Identifier üzerinde özellik değildir.
3 Compiler API analiz parçaları
| Kavram | Anlamı |
|---|---|
ts.createSourceFile |
Kaynağı parse eder |
ts.forEachChild |
AST'yı gezer |
ts.isFunctionDeclaration |
Fonksiyon tanır |
node.parameters |
Parametrelere erişir |