Özet - Branded types
- TypeScript kursu
- İleri seviye
- Ders 20/57
- 4 dk
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 atanamazUygulama 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
// 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
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ı
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
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 |