Özet - Phantom types
- TypeScript kursu
- İleri seviye
- Ders 24/57
- 4 dk
Phantom türlerle durum güvenli bir sipariş akışı yazarsın.
Özet - Phantom types
Phantom türler, kullanılmayan generic parametrelerle tür güvenliği sağlar. State encoding ile durum makinelerini türe kodlarız; geçersiz geçişler derleme hatası olur. API tasarımında fonksiyonların yanlış sırada çağrılmasını engeller. Çalışma zamanında ek maliyet yoktur; tüm güvenlik derleme zamanındadır.
type Order<S> = { amount: number };
type Pending = Order<"pending">;
type Paid = Order<"paid">;
type Shipped = Order<"shipped">;
function pay(o: Pending): Paid { return o; }
function ship(o: Paid): Shipped { return o; }
function deliver(o: Shipped): string { return `delivered ${o.amount}`; }
const p: Pending = { amount: 10 };
const result = deliver(ship(pay(p)));Uygulama Phantom ile sipariş akışı
Order<S> generic türünü tanımla (gövde amount: number). Pending, Paid, Shipped türlerini phantom argümanlarla oluştur. pay(o: Pending): Paid, ship(o: Paid): Shipped ve deliver(o: Shipped): string fonksiyonlarını yaz (deliver `delivered ${o.amount}` döndürsün). Bir Pending değerinden başla, pay, ship, deliver sırasıyla uygula ve sonucu console.log ile yazdır.
Başlangıç kodu
// Order<S> generic türünü tanımla (S gövdede kullanılmasın)
// Pending, Paid, Shipped türlerini phantom argümanlarla oluştur
// pay, ship, deliver fonksiyonlarını yaz
// Pending değerinden başla, pay/ship/deliver uygula, sonucu yazdırÖrnek çözüm
type Order<S> = { amount: number };
type Pending = Order<"pending">;
type Paid = Order<"paid">;
type Shipped = Order<"shipped">;
function pay(o: Pending): Paid {
return o;
}
function ship(o: Paid): Shipped {
return o;
}
function deliver(o: Shipped): string {
return `delivered ${o.amount}`;
}
const p: Pending = { amount: 10 };
const result = deliver(ship(pay(p)));
console.log(result);Beklenen çıktı
delivered 10
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Phantom türlerin çalışma zamanı maliyeti nedir?
- Çalışma zamanı tür bilgisi ekler
- Her phantom parametre için bir bayt
- Sıfır Doğru cevap
- Her durum geçişi için bir hesaplama
Açıklama: Phantom parametre yalnızca tür düzeyinde vardır; derleme sonrası silinir. Çalışma zamanında hiçbir ek değer veya kontroller yoktur.
2 Üç durumlu sipariş akışı
type Order<S> = { amount: number };
type Pending = Order<"pending">;
type Paid = Order<"paid">;
type Shipped = Order<____>;
function ship(o: Paid): Shipped { return o; }
type Order<S> = { amount: number };
type Pending = Order<"pending">;
type Paid = Order<"paid">;
type Shipped = Order<"shipped">;
function ship(o: Paid): Shipped { return o; }
Açıklama: Shipped durumu kendi phantom argümanıyla temsil edilir; ship fonksiyonu Paid alıp Shipped döndürür ve geçiş tür düzeyinde güvence altına alınır.
3 Phantom types özet eşleştirmesi
| Kavram | Anlamı |
|---|---|
Phantom parametre |
gövdede kullanılmayan generic parametre |
State encoding |
durumları türe kodlamak |
Geçiş fonksiyonu |
yanlış durumu derleme zamanında reddeder |
Çalışma zamanı maliyeti |
sıfır |