CodeBlanks Logo Icon CodeBlanks

Phantom type nedir?

Hayali tür parametreleriyle güvenliği öğrenirsin.

Phantom type nedir?

Phantom type, generic tür parametresi olarak tanımlanıp türün gövdesinde hiç kullanılmayan parametredir. Bu parametre yalnızca tür düzeyinde bilgi taşır; çalışma zamanında karşılığı yoktur. Amacı, aynı yapıya sahip değerleri farklı türler olarak işaretlemek ve böylece yanlış kullanımları derleme zamanında yakalamaktır.

type Order<T> = { amount: number };
// T parametresi gövdede kullanılmıyor: phantom

type PendingOrder = Order<"pending">;
type PaidOrder = Order<"paid">;

Phantom ile nominal benzerlik

Phantom parametre, branded type'daki işaretçi alanının yerini alır. Aynı yapıya sahip iki değer farklı phantom argümanlarla farklı türler olur; bu sayede derleme zamanında karıştırılmaları engellenir. Çalışma zamanında değerler özdeştir.

type Order<T> = { amount: number };

const pending: Order<"pending"> = { amount: 10 };
const paid: Order<"paid"> = { amount: 10 };

const x: Order<"paid"> = pending;  // hata: türleri farklı

Uygulama Phantom ile iki tür ayır

Order<T> adında, T parametresini gövdede kullanmayan bir generic tür tanımla (gövdede amount: number olsun). PendingOrder ve PaidOrder türlerini phantom argümanlarla oluştur. Her türden bir değer oluştur ve console.log ile her ikisinin amount değerini yazdır.

Başlangıç kodu

index.ts
// Order<T> generic türünü tanımla (T gövdede kullanılmasın)

// PendingOrder ve PaidOrder türlerini phantom argümanlarla oluştur

// Her türden bir değer oluştur ve amount değerlerini yazdır

Örnek çözüm

index.ts
type Order<T> = { amount: number };

type PendingOrder = Order<"pending">;
type PaidOrder = Order<"paid">;

const pending: PendingOrder = { amount: 10 };
const paid: PaidOrder = { amount: 20 };

console.log(pending.amount);
console.log(paid.amount);

Beklenen çıktı

10
20

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Phantom type parametresi hangi özelliğe sahiptir?

  • Derleme zamanında yok sayılır
  • Türün gövdesinde hiç kullanılmaz Doğru cevap
  • Çalışma zamanında bir değer taşır
  • Yalnızca sınıflarda kullanılabilir

Açıklama: Phantom parametre generic olarak bildirilir ama türün gövdesinde hiç kullanılmaz; bu yüzden yalnızca tür düzeyinde işaret olarak çalışır.

2 Phantom type gövdesi

Soru
type Order<T> = { ____ };  // T gövdede yok: phantom
Cevap
type Order<T> = { amount: number };  // T gövdede yok: phantom

Açıklama: amount: number özelliği T parametresini kullanmaz; bu yüzden T phantom olarak kalır ve farklı argümanlar farklı türler oluşturur.

3 Phantom type parçaları

Kavram Anlamı
Generic parametre tür gövdesinde kullanılmaz
Phantom type yalnızca tür düzeyinde işaret
Farklı phantom argümanlar farklı türler oluşturur
Çalışma zamanı phantom parametre yok

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