CodeBlanks Logo Icon CodeBlanks

Transformer nedir?

Transformer fonksiyonlarını öğrenirsin.

Transformer fonksiyonu

Bir transformer, TypeScript derleyicisinde AST düğümlerini dönüştüren fonksiyondur. ts.TransformerFactory<T> türündedir: bir TransformationContext alır ve bir visitor fonksiyonu döndürür. Visitor her düğümü alır ve aynı veya yeni bir düğüm döndürür.

import ts from "typescript";

const transformer: ts.TransformerFactory<ts.SourceFile> =
  (context) => (node) => {
    return ts.visitEachChild(node, visit, context);
  };

Transformer'lar ts.transform ile kaynak dosyalara uygulanır.

ts.transform ve visitEachChild

ts.transform(source, transformers) bir kaynak düğümü verilen transformer'larla dönüştürür ve bir TransformResult döndürür. result.transformed[0] dönüştürülmüş kök düğümdür. Alt düğümleri dönüştürmek için ts.visitEachChild(node, visitor, context) kullanılır.

const result = ts.transform(sf, [transformer]);
const out = result.transformed[0];
result.dispose();

Sonuç bitince result.dispose() ile belleği temizlersin.

Uygulama Identity transformer

const x = 1; kaynağından bir SourceFile oluştur. ts.TransformerFactory tanımla: visitor düğümü değiştirmeden döndürsün (identity). ts.transform ile uygula ve ts.createPrinter ile dönüştürülmüş kaynağı yazdır.

Başlangıç kodu

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

// Kaynak: const x = 1;
// SourceFile oluştur
// Bir TransformerFactory tanımla (identity: düğümü değiştirmeden döndür)
// transform ile uygula
// Printer ile sonucu yazdır

// kodunu buraya yaz

Örnek çözüm

index.ts
import ts from "typescript";

const sourceText = "const x = 1;";
const sf = ts.createSourceFile("app.ts", sourceText, ts.ScriptTarget.Latest, true);

const transformer: ts.TransformerFactory<ts.SourceFile> = (context) => (node) => {
  return node;
};

const result = ts.transform(sf, [transformer]);
const printer = ts.createPrinter();
process.stdout.write(printer.printFile(result.transformed[0] as ts.SourceFile));
result.dispose();

Beklenen çıktı

const x = 1;

Soru ve cevaplar

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

1 Bir TransformerFactory hangi imzaya sahiptir?

  • (node) => node
  • (source) => string
  • (program) => TypeChecker
  • (context) => (node) => node Doğru cevap

Açıklama: TransformerFactory, TransformationContext alır ve (node) => node visitor fonksiyonu döndürür. Doğrudan node veya source almaz.

2 Alt düğümleri ziyaret et

Soru
const transformer: ts.TransformerFactory<ts.SourceFile> = (context) => (node) => {
  return ts.____(node, visit, context);
};
Cevap
const transformer: ts.TransformerFactory<ts.SourceFile> = (context) => (node) => {
  return ts.visitEachChild(node, visit, context);
};

Açıklama: ts.visitEachChild alt düğümleri visitor ile dönüştürür ve yeni üst düğüm döndürür; forEachChild salt okur gezer, visitNode tek düğüm içindir.

3 Transformer parçaları

Kavram Anlamı
ts.TransformerFactory Transformer fonksiyon türü
ts.transform Dönüştürmeyi uygular
visitEachChild Alt düğümleri dönüştürür
TransformResult Dönüştürülmüş kökü taşır

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