TypeScript
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.
Örnek çözümü göster
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);
Kendini test et
-
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
Cevabı göster
Her brand için benzersiz bir dize işaret kullanmak — 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.
-
declare ile brand sembolü
// Çalışma zamanı kodu olmadan benzersiz brand sembolü:
____
type Brand<T, B> = T & { readonly [__brand]: B };
Cevabı göster
// Çalışma zamanı kodu olmadan benzersiz brand sembolü:
declare const __brand: unique symbol;
type Brand<T, B> = T & { readonly [__brand]: B };
-
Brand tanımı parçaları
- 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
Sıradaki ders: Brand kullanımı