Branded type nedir?
- TypeScript kursu
- İleri seviye
- Ders 17/57
- 4 dk
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 riskliBrand 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
// 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
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
type Brand<T, B> = T & { readonly ____: B };
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 |