CodeBlanks Logo Icon CodeBlanks

never ile exhaustive

never ile tükenmişlik denetimini öğrenirsin.

never ile exhaustive

never türü, hiçbir değeri temsil etmeyen türedir. Bir switch ifadesinde tüm case'ler kapsandıktan sonra geriye kalan tür never olur. Bu özelliği kullanarak, eksik case varsa derleyici hatası alırız: never beklenen bir yere başka bir tür atanamaz.

function assertNever(x: never): never {
  throw new Error("Unexpected: " + x);
}

type Shape = { kind: "circle"; radius: number } | { kind: "square"; size: number };

function area(s: Shape): number {
  switch (s.kind) {
    case "circle": return Math.PI * s.radius ** 2;
    case "square": return s.size ** 2;
    default: return assertNever(s);
  }
}

never ve daraltma

switch tüm case'leri kapsadığında, default dalında union'ın kalan türü never olur. assertNever(s) çağrısı yalnızca s never olduğunda derler; eğer bir case eksikse, s never değildir ve derleme hatası alınır.

function assertNever(x: never): never {
  throw new Error("Unexpected value");
}

function area(s: Shape): number {
  switch (s.kind) {
    case "circle": return Math.PI * s.radius ** 2;
    case "square": return s.size ** 2;
    default: return assertNever(s);  // s: never
  }
}

Uygulama assertNever ile exhaustive area

assertNever(x: never): never yardımcı fonksiyonunu tanımla (içinde throw new Error("Unexpected") olsun). Shape discriminated union türünü tanımla: "circle" (radius: number), "square" (size: number) üyeleri. area(s: Shape): number fonksiyonunu switch (s.kind) ile yaz: circle için Math.PI * s.radius ** 2, square için s.size ** 2, default için return assertNever(s); yaz. console.log(area({ kind: "square", size: 4 })) ile sonucu yazdır.

Başlangıç kodu

index.ts
// assertNever fonksiyonunu tanımla (never parametre, never dönüş, throw içersin)

// Shape discriminated union türünü tanımla (kind: circle, square)

// area fonksiyonunu switch ile yaz, default'ta assertNever çağır

// square şeklinin alan sonucunu yazdır

Örnek çözüm

index.ts
function assertNever(x: never): never {
  throw new Error("Unexpected");
}

type Shape =
  | { kind: "circle"; radius: number }
  | { kind: "square"; size: number };

function area(s: Shape): number {
  switch (s.kind) {
    case "circle":
      return Math.PI * s.radius ** 2;
    case "square":
      return s.size ** 2;
    default:
      return assertNever(s);
  }
}

console.log(area({ kind: "square", size: 4 }));

Beklenen çıktı

16

Soru ve cevaplar

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

1 never türü exhaustive check'te nasıl kullanılır?

  • Switch case'lerini otomatik yazar
  • Union üyelerini sayar
  • Eksik case varsa default dalında never beklenen yere hata verir Doğru cevap
  • Çalışma zamanında değer kontrol eder

Açıklama: default dalında kalan tür tüm case'ler kapsandığında never olur; assertNever(x: never) çağrısı yalnızca never kabul eder, eksik case varsa derleme hatası verir.

2 assertNever imzası

Soru
function assertNever(x: ____): never {
  throw new Error("Unexpected");
}
Cevap
function assertNever(x: never): never {
  throw new Error("Unexpected");
}

Açıklama: assertNever parametre olarak never alır; bu, yalnızca tüm case'ler kapsandığında çağrılabileceği anlamına gelir, aksi halde derleme hatası verir.

3 never ile exhaustive parçaları

Kavram Anlamı
never türü hiçbir değeri temsil etmez
default dalı tüm case'ler sonrası kalan tür
assertNever(s) s never değilse hata verir
Exhaustive check eksik case'i derleyici yakalar

İleri seviye bölümündeki tüm dersler