CodeBlanks Logo Icon CodeBlanks

TypeChecker

TypeChecker ile sembol ve tür çözümlemeyi öğrenirsin.

TypeChecker nedir?

TypeChecker, Program tarafından üretilen sembol ve tür çözümleyicisidir. program.getTypeChecker() ile alınır. Bir düğümün sembolünü getSymbolAtLocation, türünü getTypeAtLocation ile alırsın.

const program = ts.createProgram(["app.ts"], {}, host);
const checker = program.getTypeChecker();

const sym = checker.getSymbolAtLocation(node);
const type = checker.getTypeAtLocation(node);

TypeChecker olmadan AST yalnızca sözdizimidir; anlamı yoktur.

Symbol ve Type

Bir Symbol, bir tanımı temsil eder: değişken, fonksiyon ya da sınıf. symbol.getName() tanımın adını döndürür. Bir Type ise tür bilgisi taşır; insan-okur biçim için checker.typeToString(type) kullanırsın.

const sym = checker.getSymbolAtLocation(id);
console.log(sym?.getName()); // "greeting"

const t = checker.getTypeAtLocation(id);
console.log(checker.typeToString(t)); // "string"

Uygulama Sembol çöz ve adını yazdır

Bellekteki app.ts kaynağı let greeting = 'merhaba'; olsun. Bir CompilerHost tanımla, noLib: true ile program oluştur. TypeChecker al, greeting tanımlayıcısının sembolünü getSymbolAtLocation ile çöz ve getName() yöntemiyle adını yazdır.

Başlangıç kodu

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

// Kaynak: let greeting = 'merhaba';
// host'u tanımla (noLib: true ile)
// TypeChecker al
// greeting tanımlayıcısını bul, sembolünü çöz ve adını yazdır

// kodunu buraya yaz

Örnek çözüm

index.ts
import ts from "typescript";

const fileName = "app.ts";
const sourceText = "let greeting = 'merhaba';";

const host: ts.CompilerHost = {
  fileExists: (n) => n === fileName,
  readFile: (n) => (n === fileName ? sourceText : undefined),
  getSourceFile: (n, lang) =>
    n === fileName ? ts.createSourceFile(n, sourceText, lang, true) : undefined,
  writeFile: () => {},
  getDefaultLibFileName: () => "lib.d.ts",
  useCaseSensitiveFileNames: () => true,
  getCanonicalFileName: (n) => n,
  getCurrentDirectory: () => "",
  getNewLine: () => "\n",
};

const program = ts.createProgram([fileName], { noLib: true }, host);
const checker = program.getTypeChecker();
const sf = program.getSourceFile(fileName)!;
const stmt = sf.statements[0] as ts.VariableStatement;
const id = stmt.declarationList.declarations[0].name as ts.Identifier;
const sym = checker.getSymbolAtLocation(id);
console.log(sym?.getName());

Beklenen çıktı

greeting

Soru ve cevaplar

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

1 TypeChecker nesnesi nasıl alınır?

  • program.getChecker()
  • checker.from(program)
  • ts.createChecker(program)
  • program.getTypeChecker() Doğru cevap

Açıklama: TypeChecker, program.getTypeChecker() ile alınır; bu yöntem sembol ve tür çözümleyiciyi döndürür. Diğer adlar Program üzerinde yoktur.

2 Sembolün adı

Soru
const checker = program.getTypeChecker();
const decl = (sf.statements[0] as ts.VariableStatement).declarationList.declarations[0];
const sym = checker.getSymbolAtLocation(decl.name);
console.log(sym?.____());
Cevap
const checker = program.getTypeChecker();
const decl = (sf.statements[0] as ts.VariableStatement).declarationList.declarations[0];
const sym = checker.getSymbolAtLocation(decl.name);
console.log(sym?.getName());

Açıklama: Symbol.getName() sembolün tanım adını döndürür; getType ve getId Symbol üzerinde yoktur, toString ise nesne varsayılanını verir.

3 TypeChecker parçaları

Kavram Anlamı
program.getTypeChecker() TypeChecker döndürür
getSymbolAtLocation(node) Symbol | undefined döndürür
getTypeAtLocation(node) Type döndürür
symbol.getName() Tanımın adını verir

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