CodeBlanks Logo Icon CodeBlanks

Branded type nedir?

Markalı türlerle nominal benzerlik öğrenirsin.

Branded type nedir?

TypeScript yapısal (structural) tip sistemine sahiptir; iki tür aynı şekle sahipse birbirine atanabilir. Bu yüzden type UserId = string ve type OrderId = string aslında aynı türdür ve yanlışlıkla birbirinin yerine kullanılabilir. Branded type, türe derleme zamanında görünmez bir işaretçi (marker) ekleyerek bu türleri yapısal olarak farklı kılar; bu, nominal tip sistemine benzer bir güvenlik sağlar.

type UserId = string;
type OrderId = string;

const uid: UserId = "u1";
const oid: OrderId = uid;  // yapısal tip: geçerli ama riskli

Brand ile nominal benzerlik

Brand pattern, temel türü bir intersection ile işaretleyerek yapısal olarak farklı kılar. İşaret alanı çalışma zamanında yoktur; yalnızca derleme zamanında türleri ayırt eder. Böylece UserId ve OrderId aynı temel türe dayalsa bile birbirine atanamaz.

type Brand<T, B> = T & { readonly __brand: B };

type UserId = Brand<string, "UserId">;
type OrderId = Brand<string, "OrderId">;

const uid = "u1" as UserId;
const oid: OrderId = uid;  // hata: türleri farklı

Uygulama Brand ile iki türü ayır

Brand<T, B> generic yardımcı türünü intersection ile tanımla. Bu yardımcıyı kullanarak UserId ve OrderId türlerini oluştur (ikisi de string tabanlı). uid değerini "u1"'den UserId olarak, oid değerini "o1"'den OrderId olarak type assertion ile oluştur. Her iki değeri console.log ile yazdır.

Başlangıç kodu

index.ts
// Brand<T, B> generic yardımcı türünü intersection ile tanımla

// UserId ve OrderId türlerini Brand ile oluştur

// uid ve oid değerlerini uygun cast'lerle oluştur

// Her ikisini yazdır

Örnek çözüm

index.ts
type Brand<T, B> = T & { readonly __brand: B };

type UserId = Brand<string, "UserId">;
type OrderId = Brand<string, "OrderId">;

const uid = "u1" as UserId;
const oid = "o1" as OrderId;

console.log(uid);
console.log(oid);

Beklenen çıktı

u1
o1

Soru ve cevaplar

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

1 type UserId = string ve type OrderId = string tanımları için aşağıdakilerden hangisi doğrudur?

  • UserId yalnızca 'u' önekiyle başlayan string değerleri kabul eder
  • UserId ve OrderId yapısal olarak aynı olduğundan birbirine atanabilir Doğru cevap
  • UserId ve OrderId farklı isimlere sahip olduğundan atanamaz
  • TypeScript derleyici isimleri karşılaştırır

Açıklama: TypeScript yapısal tipleri isimlere göre değil şekillere göre karşılaştırır; iki alias da string olduğundan yapısal olarak eşdeğerdir ve birbirine atanabilir.

2 Brand işaretçisi

Soru
type Brand<T, B> = T & { readonly ____: B };
Cevap
type Brand<T, B> = T & { readonly __brand: B };

Açıklama: Geleneksel brand işaretçisi __brand alanıdır; bu alan çalışma zamanında yoktur ama derleme zamanında türleri ayırt eder.

3 Branded type parçaları

Kavram Anlamı
Yapısal tip sistemi aynı şekil = atanabilir
Nominal tip sistemi isim farklı = atanamaz
Brand pattern yapısal tipleri nominal gibi yapar
__brand alanı derleme zamanı işaretçisi

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