CodeBlanks Logo Icon CodeBlanks

Özet - Phantom types

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

index.ts
// 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

index.ts
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ışı

Soru
type Order<S> = { amount: number };
type Pending = Order<"pending">;
type Paid = Order<"paid">;
type Shipped = Order<____>;

function ship(o: Paid): Shipped { return o; }
Cevap
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

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