State Encoding
- TypeScript kursu
- İleri seviye
- Ders 22/57
- 4 dk
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ğilUygulama 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.
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 ve ship geçiş fonksiyonlarını yaz
// Pending değerinden başla, pay ve ship 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;
}
const p: Pending = { amount: 10 };
const shipped = ship(pay(p));
console.log(shipped.amount);Beklenen çıktı
10
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 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ı Doğru cevap
Açıklama: 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.
2 Geçiş fonksiyonu imzası
type Order<S> = { amount: number };
type Pending = Order<"pending">;
type Paid = Order<"paid">;
function pay(o: Pending): ____ { return o; }
type Order<S> = { amount: number };
type Pending = Order<"pending">;
type Paid = Order<"paid">;
function pay(o: Pending): Paid { return o; }
Açıklama: pay fonksiyonu Pending alır ve Paid döndürür; bu, durum geçişini tür düzeyinde zorlar ve yanlış sırayı engeller.
3 State encoding parçaları
| Kavram | Anlamı |
|---|---|
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) |