Compile-time güvenlik
- TypeScript kursu
- İleri seviye
- Ders 35/57
- 4 dk
Derleme zamanı güvenliğini garanti etmeyi öğrenirsin.
Compile-time güvenlik
Exhaustive check ile derleme zamanı güvenliği sağlanır. Yeni bir union üyesi eklendiğinde, tüm switch'lerdeki case'ler artık tükenmiş değildir; assertNever çağrısı derleme hatası verir ve eksik yerleri bildirir. Bu, çalışma zamanı hatalarını önler.
type Status = "pending" | "paid" | "shipped";
function label(s: Status): string {
switch (s) {
case "pending": return "Beklemede";
case "paid": return "Ödendi";
case "shipped": return "Gönderildi";
default: return assertNever(s);
}
}Çalışma zamanı vs derleme zamanı
assertNever fonksiyonu çalışma zamanında throw yapar; asıl değeri derleme zamanındadır. Eğer tüm case'ler yazılırsa, default dalına hiç gelinmez ve throw asla çalışmaz. Asıl koruma, derleyicinin eksik case'i yakalamasıdır.
function assertNever(x: never): never {
throw new Error("Unexpected: " + x);
}
// Tüm case'ler yazılıysa default'a hiç gelinmez
// assertNever asla çağrılmazUygulama Status label with exhaustive check
assertNever(x: never): never fonksiyonunu tanımla (içinde throw new Error("Unexpected") olsun). Status = "pending" | "paid" | "shipped" union türünü tanımla. label(s: Status): string fonksiyonunu switch (s) ile yaz: pending için "Beklemede", paid için "Ödendi", shipped için "Gönderildi", default için return assertNever(s); yaz. console.log(label("shipped")) ile sonucu yazdır.
Başlangıç kodu
// assertNever fonksiyonunu tanımla (never parametre, never dönüş, throw içersin)
// Status union türünü tanımla (pending, paid, shipped)
// label fonksiyonunu switch ile yaz, default'ta assertNever çağır
// "shipped" durumunun etiketini yazdırÖrnek çözüm
function assertNever(x: never): never {
throw new Error("Unexpected");
}
type Status = "pending" | "paid" | "shipped";
function label(s: Status): string {
switch (s) {
case "pending":
return "Beklemede";
case "paid":
return "Ödendi";
case "shipped":
return "Gönderildi";
default:
return assertNever(s);
}
}
console.log(label("shipped"));Beklenen çıktı
Gönderildi
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Exhaustive check derleme zamanı güvenliğini nasıl sağlar?
- Çalışma zamanında throw yapar
- Tüm case'leri otomatik yazar
- Yeni üye eklendiğinde eksik case'leri derleyici bildirir Doğru cevap
- never türünü kaldırır
Açıklama: Yeni üye eklendiğinde, eksik case'lerin bulunduğu switch'lerde default dalındaki değişken never olmaz; assertNever çağrısı derleme hatası verir ve eksik yerleri bildirir.
2 Status exhaustive switch
function assertNever(x: never): never {
throw new Error("Unexpected");
}
type Status = "pending" | "paid" | "shipped";
function label(s: Status): string {
switch (s) {
case "pending": return "Beklemede";
case "paid": return "Ödendi";
case "shipped": return "Gönderildi";
default:
return ____;
}
}
function assertNever(x: never): never {
throw new Error("Unexpected");
}
type Status = "pending" | "paid" | "shipped";
function label(s: Status): string {
switch (s) {
case "pending": return "Beklemede";
case "paid": return "Ödendi";
case "shipped": return "Gönderildi";
default:
return assertNever(s);
}
}
Açıklama: default dalında assertNever(s) çağrısı, s never değilse (yani bir case eksikse) derleme hatası verir; bu, derleme zamanı güvenliğini sağlar.
3 Compile-time güvenlik parçaları
| Kavram | Anlamı |
|---|---|
assertNever(x: never) |
parametresi never olmalı |
Tüm case'ler |
default'a gelinmez |
Yeni üye eklenince |
eksik case derleyicide hata |
Derleme zamanı |
asıl güvenlik burada |