CodeBlanks Logo Icon CodeBlanks

Özet - Branded types

Branded türlerle karıştırılamaz UserId ve OrderId yazarsın.

Özet - Branded types

Branded türler, TypeScript'in yapısal tip sistemine nominal güvenlik katar. Intersection ile eklenen işaret alanı, aynı temel türe dayalı türleri yapısal olarak farklı kılar. declare ile unique symbol kullanımı çalışma zamanı maliyetini sıfıra indirir. Validation yardımcıları markanın yalnızca geçerli değerlerle oluşturulmasını sağlar.

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

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

function makeUserId(s: string): UserId {
  return s as UserId;
}

const uid = makeUserId("u1");
const oid: OrderId = uid;  // hata: UserId, OrderId'ye atanamaz

Uygulama UserId ve OrderId markalı türlerini yaz

Brand<T, B> yardımcı türünü intersection ile tanımla. UserId ve OrderId türlerini ayrı markalarla oluştur. makeUserId(s: string): UserId ve makeOrderId(s: string): OrderId yardımcı fonksiyonlarını yaz (ikisi de as ile döndürsün). Bir uid değeri makeUserId("u1") ile, bir oid değeri makeOrderId("o1") ile oluştur. Her ikisini de console.log ile yazdır. Ardından console.log("done") yazdır.

Başlangıç kodu

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

// UserId ve OrderId türlerini ayrı markalarla oluştur

// makeUserId ve makeOrderId yardımcı fonksiyonlarını yaz

// uid ve oid değerlerini oluştur ve yazdır, sonra "done" yazdır

Örnek çözüm

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

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

function makeUserId(s: string): UserId {
  return s as UserId;
}

function makeOrderId(s: string): OrderId {
  return s as OrderId;
}

const uid = makeUserId("u1");
const oid = makeOrderId("o1");

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

Beklenen çıktı

u1
o1
done

Soru ve cevaplar

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

1 Brand pattern'in temel faydası nedir?

  • Otomatik kod tamamlama sağlamak
  • Çalışma zamanı performansını artırmak
  • Aynı temel türe dayalı türleri yapısal olarak farklı kılmak Doğru cevap
  • Daha kısa kod yazmak

Açıklama: Brand pattern, yapısal tip sisteminde nominal benzerlik sağlar; UserId ve OrderId gibi aynı temel türe dayalı türleri yapısal olarak farklı kılarak karıştırılmalarını engeller.

2 Brand ile UserId ve OrderId ayrımı

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

type UserId = Brand<string, "UserId">;
// OrderId, UserId'den farklı olmalı:
type OrderId = Brand<string, ____>;

const uid = "u1" as UserId;
const oid: OrderId = uid;  // hata: farklı markalar
Cevap
type Brand<T, B extends string> = T & { readonly __brand: B };

type UserId = Brand<string, "UserId">;
// OrderId, UserId'den farklı olmalı:
type OrderId = Brand<string, "OrderId">;

const uid = "u1" as UserId;
const oid: OrderId = uid;  // hata: farklı markalar

Açıklama: OrderId'nin UserId'den farklı olması için brand dizesi farklı olmalıdır; "UserId" kullanırsanız OrderId ile UserId aynı tür olur ve atanabilir hale gelir.

3 Branded types özet eşleştirmesi

Kavram Anlamı
Yapısal tip sistemi aynı şekil = atanabilir
Brand pattern aynı temel türden farklı türler
declare const __brand sıfır çalışma zamanı kodu
Validation yardımcısı yalnızca geçerli değerlerle marka

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