TypeChecker
- TypeScript kursu
- Uzman
- Ders 2/35
- 4 dk
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
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
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ı
const checker = program.getTypeChecker();
const decl = (sf.statements[0] as ts.VariableStatement).declarationList.declarations[0];
const sym = checker.getSymbolAtLocation(decl.name);
console.log(sym?.____());
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 |