TypeScript
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.
Örnek çözümü göster
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);
Kendini test et
-
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
- UserId ve OrderId farklı isimlere sahip olduğundan atanamaz
- TypeScript derleyici isimleri karşılaştırır
Cevabı göster
UserId ve OrderId yapısal olarak aynı olduğundan birbirine atanabilir — 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.
-
Brand işaretçisi
type Brand<T, B> = T & { readonly ____: B };
Cevabı göster
type Brand<T, B> = T & { readonly __brand: B };
-
Branded type parçaları
- 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
Sıradaki ders: Brand tanımı