TypeScript
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.
Örnek çözümü göster
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());
Kendini test et
-
TypeChecker nesnesi nasıl alınır?
- program.getChecker()
- checker.from(program)
- ts.createChecker(program)
- program.getTypeChecker()
Cevabı göster
program.getTypeChecker() — 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.
-
Sembolün adı
const checker = program.getTypeChecker();
const decl = (sf.statements[0] as ts.VariableStatement).declarationList.declarations[0];
const sym = checker.getSymbolAtLocation(decl.name);
console.log(sym?.____());
Cevabı göster
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());
-
TypeChecker parçaları
- 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
Sıradaki ders: AST ziyareti