CodeBlanks Logo Icon CodeBlanks

Brand tanımı

Intersection ile brand tanımlamayı öğrenirsin.

Brand tanımı

Brand yardımcı türü, temel türü bir intersection ve readonly özellik ile genişletir. Bu özellik çalışma zamanında erişilemez; yalnızca derleme zamanında türleri ayırt eder. B extends string kısıtı, her brand için benzersiz bir dize kullanmanızı sağlar.

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

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

const e: Email = "x@y.com" as Email;

declare ile unique symbol

declare const ile benzersiz bir sembol tanımlayıp bunu brand alanı olarak kullanmak, markanın yanlışlıkla erişilmesini zorlaştırır. Sembol çalışma zamanında yoktur ama derleme zamanında türleri ayırt eder. Bu, daha güçlü bir kapsülleme sağlar.

declare const __brand: unique symbol;

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

Uygulama unique symbol ile brand tanımla

declare const __brand: unique symbol; kullanarak brand sembolünü tanıt. Brand<T, B> yardımcı türünü [__brand] anahtarıyla intersection olarak tanımla. Bu yardımcıyı kullanarak Email türünü (string tabanlı) oluştur. Bir Email değeri "x@y.com" ile type assertion yaparak oluştur ve console.log ile yazdır.

Başlangıç kodu

index.ts
// Çalışma zamanı kodu olmadan benzersiz brand sembolü tanıt

// Brand<T, B> yardımcı türünü sembol anahtarıyla tanımla

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

// Email değerini assertion ile oluştur ve yazdır

Örnek çözüm

index.ts
declare const __brand: unique symbol;

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

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

const email = "x@y.com" as Email;
console.log(email);

Beklenen çıktı

x@y.com

Soru ve cevaplar

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

1 Brand yardımcı türünde B extends string kısıtının amacı nedir?

  • Brand alanının çalışma zamanında görünür olmasını sağlamak
  • Intersection işlemini devre dışı bırakmak
  • Temel türü string ile sınırlamak
  • Her brand için benzersiz bir dize işaret kullanmak Doğru cevap

Açıklama: B extends string kısıtı, her brand için farklı bir dize kullanmanızı sağlar; bu da UserId ve OrderId gibi türleri yapısal olarak birbirinden farklı kılar.

2 declare ile brand sembolü

Soru
// Çalışma zamanı kodu olmadan benzersiz brand sembolü:
____

type Brand<T, B> = T & { readonly [__brand]: B };
Cevap
// Çalışma zamanı kodu olmadan benzersiz brand sembolü:
declare const __brand: unique symbol;

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

Açıklama: declare const __brand: unique symbol çalışma zamanında değer üretmeden derleyiciye benzersiz bir sembol türü bildirir; marka yalnızca derleme zamanında kullanıldığından bu idealdir.

3 Brand tanımı parçaları

Kavram Anlamı
Brand yardımcı türü intersection ile tanım
B extends string her brand için benzersiz dize
declare const __brand çalışma zamanı kodu yok
unique symbol benzersiz derleme zamanı işareti

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