CodeBlanks Logo Icon CodeBlanks

Type sorgulama

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

index.ts
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

index.ts
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ü

Soru
for (const decl of stmt.declarationList.declarations) {
  if (!decl.____) {
    untyped++;
  }
}
Cevap
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

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