Type sorgulama
- TypeScript kursu
- Uzman
- Ders 9/35
- 4 dk
TypeChecker ile özel tür sorguları öğrenirsin.
Custom type check nedir?
Bir custom type checker, TypeScript AST'sini gezip belirli kuralları uygulayan araçtır. ts.forEachChild ile düğümleri dolaşır, ts.isVariableStatement gibi tür koruyucularıyla ilgilendiğin düğümleri tanırsın. Kurallar düğümün özelliklerine bakarak çalışır.
import ts from "typescript";
const sf = ts.createSourceFile("app.ts", code,
ts.ScriptTarget.Latest, true);
function visit(node: ts.Node) {
if (ts.isVariableStatement(node)) {
// kuralı uygula
}
ts.forEachChild(node, visit);
}
visit(sf);Düğüm özelliklerine erişim
Bir VariableStatement, declarationList.declarations dizisini taşır. Her VariableDeclaration'ın .name (tanımlayıcı) ve .type (tür eklemesi, varsa) özelliği vardır. Kuralını bu özelliklere göre yazarsın.
for (const decl of stmt.declarationList.declarations) {
if (!decl.type) {
// tür eklemesi yok
}
}Uygulama Türü eksik değişkenleri say
let x = 1; let y: string = "a"; kaynağından bir SourceFile oluştur. visit fonksiyonu yaz: her VariableStatement içinde tür eklemesi olmayan declarations'ları say. ts.forEachChild ile ağacı gez ve toplamı yazdır.
Başlangıç kodu
import * as ts from "typescript";
// Kaynak: let x = 1; let y: string = "a";
// SourceFile oluştur
// visit fonksiyonu yaz: VariableStatement düğümlerini bul
// Tür eklemesi olmayan declaration'ları say
// forEachChild ile gez
// Toplamı yazdır
// kodunu buraya yazÖrnek çözüm
import ts from "typescript";
const sourceText = 'let x = 1; let y: string = "a";';
const sf = ts.createSourceFile("app.ts", sourceText, ts.ScriptTarget.Latest, true);
let untyped = 0;
function visit(node: ts.Node) {
if (ts.isVariableStatement(node)) {
for (const decl of node.declarationList.declarations) {
if (!decl.type) {
untyped++;
}
}
}
ts.forEachChild(node, visit);
}
visit(sf);
console.log(untyped);Beklenen çıktı
1
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Bir VariableDeclaration'ın type annotation'ı olup olmadığı nasıl anlaşılır?
- checker.getTypeAtLocation(node) çağrılır
- node.type özelliği undefined değilse Doğru cevap
- node.name özelliği undefined değilse
- node.kind === SyntaxKind.TypeAnnotation
Açıklama: VariableDeclaration.type özelliği TypeNode | undefined türündedir; type annotation varsa tanımlıdır. name her zaman vardır, TypeAnnotation diye bir SyntaxKind yoktur, getTypeAtLocation ise türü çözer.
2 Tür eklemesi kontrolü
for (const decl of stmt.declarationList.declarations) {
if (!decl.____) {
untyped++;
}
}
for (const decl of stmt.declarationList.declarations) {
if (!decl.type) {
untyped++;
}
}
Açıklama: VariableDeclaration.type özelliği tür eklemesini taşır; name tanımlayıcıdır, kind düğüm tür numarasıdır, typeName diye özellik yoktur.
3 Tür kontrolü parçaları
| Kavram | Anlamı |
|---|---|
ts.isVariableStatement |
VariableStatement tanır |
declarationList.declarations |
Tanımları gezer |
decl.type |
Tür eklemesini verir |
ts.forEachChild |
Alt düğümleri gezer |