TypeScript
State Encoding
Phantom ile durum makinelerini öğrenirsin.
State encoding
Phantom türler, bir durum makinesinin aşamalarını türe kodlamak için kullanılabilir. Her durum kendi phantom argümanıyla temsil edilir; geçiş fonksiyonları yalnızca doğru durumdaki değerleri kabul eder. Böylece geçersiz geçişler derleme hatası olur.
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; }
Geçiş fonksiyonları
Geçiş fonksiyonları giriş ve çıkış türlerini phantom argümanlarla ayırır; örneğin pay fonksiyonu Order<"pending"> alır ve Order<"paid"> döndürür. Bu, fonksiyonun yalnızca doğru sıradaki çağrılabilmesini sağlar.
const p: Pending = { amount: 10 };
const paid = pay(p); // Pending -> Paid
const shipped = ship(paid); // Paid -> Shipped
const bad = ship(p); // hata: Pending, Paid değil
Uygulama State encoding 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 ve ship(o: Paid): Shipped fonksiyonlarını yaz. Bir Pending değerinden başla, pay ve ship ile akışı uygula, sonucun amount değerini console.log ile yazdır.
Örnek çözümü göster
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;
}
const p: Pending = { amount: 10 };
const shipped = ship(pay(p));
console.log(shipped.amount);
Kendini test et
-
Phantom ile state encoding'in temel avantajı nedir?
- Çalışma zamanında durum kontrolü yapılması
- Daha hızlı kod yürütme
- Daha az bellek kullanımı
- Geçersiz durum geçişlerinin derleme zamanında yakalanması
Cevabı göster
Geçersiz durum geçişlerinin derleme zamanında yakalanması — Phantom ile her durum ayrı bir tür olduğu için yanlış sıradaki geçişler (örneğin Pending'i ship etmek) derleme hatası verir; runtime kontrolüne gerek kalmaz.
-
Geçiş fonksiyonu imzası
type Order<S> = { amount: number };
type Pending = Order<"pending">;
type Paid = Order<"paid">;
function pay(o: Pending): ____ { return o; }
Cevabı göster
type Order<S> = { amount: number };
type Pending = Order<"pending">;
type Paid = Order<"paid">;
function pay(o: Pending): Paid { return o; }
-
State encoding parçaları
- Pending durumu
- ödenmemiş sipariş
- Paid durumu
- ödenmiş sipariş
- pay fonksiyonu
- Pending alır Paid döndürür
- ship(p) çağrısı
- derleme hatası (yanlış durum)
Sıradaki ders: Phantom ile API