CodeBlanks Logo Icon CodeBlanks

Brand kullanımı

Brand'li türleri fonksiyonlarda kullanmayı öğrenirsin.

Brand'li parametreler

Brand'li türleri fonksiyon parametresi olarak kullanmak, yanlış türdeki değerlerin geçmesini engeller. Sıradan bir string yerine yalnızca doğru markaya sahip değer kabul edilir; bu, karışıklığı derleme zamanında yakalar.

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

function getUser(id: UserId) {
  return `user ${id}`;
}

const uid = "u1" as UserId;
getUser(uid);     // geçerli
getUser("u1");    // hata: plain string değil

Validation ile marka oluşturma

Marka değerlerini güvenli şekilde oluşturmak için validation yapan yardımcı fonksiyonlar kullanılır. Bu fonksiyonlar girdiyi kontrol eder, geçerliyse as ile markalar ve döndürür; geçersizse hata fırlatır. Böylece marka yalnızca geçerli değerlerle oluşturulur.

type Email = Brand<string, "Email">;

function makeEmail(s: string): Email {
  if (!s.includes("@")) throw new Error("geçersiz email");
  return s as Email;
}

const e = makeEmail("a@b.com");  // geçerli

Uygulama Validation yardımcısı ile marka oluştur

Brand<T, B> yardımcı türünü intersection ile tanımla (string brand kullan). UserId türünü oluştur. makeUserId(s: string): UserId fonksiyonu yaz: boş string kontrolü yap, geçerse as UserId ile döndür, değilse throw new Error("empty"). makeUserId("u1") ile bir değer oluştur ve console.log ile yazdır.

Başlangıç kodu

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

// UserId türünü Brand ile oluştur

// makeUserId fonksiyonunu validation ile yaz

// makeUserId("u1") ile değer oluştur ve yazdır

Örnek çözüm

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

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

function makeUserId(s: string): UserId {
  if (s.length === 0) throw new Error("empty");
  return s as UserId;
}

const uid = makeUserId("u1");
console.log(uid);

Beklenen çıktı

u1

Soru ve cevaplar

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

1 Aşağıdakilerden hangisi brand'li bir fonksiyon parametresinin sağladığı güvenliktir?

  • String değerlerin otomatik olarak markaya dönüştürülmesi
  • Yanlış markaya sahip değerlerin derleme zamanında reddedilmesi Doğru cevap
  • Fonksiyonun daha hızlı çalışması
  • Çalışma zamanında marka kontrolü yapılması

Açıklama: Brand'li parametreler derleme zamanında tür güvenliği sağlar; yanlış markaya sahip değerler (örneğin OrderId'yi UserId parametresine) derleme hatası verir.

2 Validation ile marka değeri döndür

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

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

function makeUserId(s: string): UserId {
  if (s.length === 0) throw new Error("boş");
  return s ____;
}
Cevap
type Brand<T, B extends string> = T & { readonly __brand: B };

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

function makeUserId(s: string): UserId {
  if (s.length === 0) throw new Error("boş");
  return s as UserId;
}

Açıklama: Validation geçtikten sonra as UserId ile değer markalanır ve döndürülür; bu, markanın yalnızca geçerli girdilerle oluşturulmasını sağlar.

3 Brand kullanımı parçaları

Kavram Anlamı
Brand'li parametre yanlış markayı derleme zamanında reddeder
as UserId validation sonrası markalama
makeUserId(s) validation ve marka oluşturma
getUser("u1") derleme hatası (plain string)

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