- Konu sahibi
- #1
TypeScript’te
Birleşim tipi, bir değerin belirtilen seçeneklerden biri olabileceğini ifade eder. Örneğin bir siparişin durumu üç metin değerinden biriyle sınırlandırılabilir:
Bu örneği bir TypeScript dosyasına koyup derlediğinizde geçerli çağrı
Aynı değerleri farklı yerlerde isimleriyle kullanmak veya çalışma zamanında nesneye erişmek istiyorsanız, değerleri tek bir nesnede toplayın:
Nesneye yeni bir özellik eklediğinizde türetilen tip de yeni değeri kapsar. Ancak
Aşağıdaki ayrım, nesne oluşturmanın gerçekten gerekli olup olmadığına göre karar vermeyi kolaylaştırır.
Bu yapılar her durumda bire bir eşdeğer değildir. Örneğin sayısal
Tip denetimi, API’den veya kullanıcıdan gelen veriyi çalışma zamanında doğrulamaz. Örneğin dışarıdan gelen değer
Bu örneği nesne ve fonksiyon tanımlarının altına eklediğinizde
enum yerine, yalnızca belirli değerleri kabul eden bir tip gerekiyorsa literal birleşim tipi kullanın. Değerlere Durum.Aktif gibi isimlerle çalışma zamanında da erişmek istiyorsanız as const ile tanımlanmış bir nesne oluşturup tipini bu nesneden türetin. Seçim, değerlerin yalnızca tip denetiminde mi yoksa çalışan JavaScript kodunda da mı gerektiğine bağlıdır.Yalnızca tip gerekiyorsa birleşim tipi kullanın
Birleşim tipi, bir değerin belirtilen seçeneklerden biri olabileceğini ifade eder. Örneğin bir siparişin durumu üç metin değerinden biriyle sınırlandırılabilir:
Kod:
type SiparisDurumu = "bekliyor" | "hazirlaniyor" | "tamamlandi";
function durumYazdir(durum: SiparisDurumu): void {
console.log(durum);
}
durumYazdir("bekliyor");
// durumYazdir("iptal"); // Tip hatası
Bu örneği bir TypeScript dosyasına koyup derlediğinizde geçerli çağrı
bekliyor yazdırır. Yorum satırındaki çağrıyı açarsanız TypeScript, "iptal" değerinin tanımlanan seçenekler arasında olmadığını bildirir. Birleşim tipi JavaScript çıktısında bir nesne oluşturmaz; dolayısıyla bu tip üzerinden çalışma zamanında değer listesi okuyamazsınız.İsimli sabitler için as const nesnesi oluşturun
Aynı değerleri farklı yerlerde isimleriyle kullanmak veya çalışma zamanında nesneye erişmek istiyorsanız, değerleri tek bir nesnede toplayın:
Kod:
const SiparisDurumlari = {
Bekliyor: "bekliyor",
Hazirlaniyor: "hazirlaniyor",
Tamamlandi: "tamamlandi",
} as const;
type SiparisDurumu =
typeof SiparisDurumlari[keyof typeof SiparisDurumlari];
function durumYazdir(durum: SiparisDurumu): void {
console.log(durum);
}
durumYazdir(SiparisDurumlari.Bekliyor);
// durumYazdir("iptal"); // Tip hatası
as const, değerlerin string gibi geniş bir tipe dönüşmesini önler ve nesne özelliklerini tip düzeyinde salt okunur yapar. typeof nesnenin tipini, keyof ise anahtarlarını alır; birlikte kullanılan ifade bu anahtarlara karşılık gelen değerlerden birleşim tipi oluşturur. Örnekte sonuç, ilk bölümdeki üç değerli SiparisDurumu tipidir.Nesneye yeni bir özellik eklediğinizde türetilen tip de yeni değeri kapsar. Ancak
as const nesneyi çalışma zamanında dondurmaz; değişmezliği çalışma zamanında da zorlamak gerekiyorsa ayrıca uygun bir mekanizma kullanmalısınız.Hangi durumda hangisini seçmeli?
Aşağıdaki ayrım, nesne oluşturmanın gerçekten gerekli olup olmadığına göre karar vermeyi kolaylaştırır.
| İhtiyaç | Tercih |
|---|---|
| Yalnızca izin verilen değerleri tiple sınırlamak | Literal birleşim tipi |
| İsimli sabitlere veya değer nesnesine çalışma zamanında erişmek | as const nesnesi ve türetilmiş tip |
| Mevcut enum davranışına veya sayısal ters eşlemeye ihtiyaç duymak | Enum kullanmayı sürdürmek |
enum üyelerinde değerden isme ters eşleme oluşturulur; sıradan nesne bunu otomatik sağlamaz. Ayrıca birleşim tipi ve nesneden türetilen tip, karşılık gelen ham metin değerlerini de kabul eder. Mevcut bir enum değiştirilirken çağrıları, dışa aktarılan tipleri ve çalışma zamanında beklenen davranışı kontrol edin.Dışarıdan gelen değerleri ayrıca doğrulayın
Tip denetimi, API’den veya kullanıcıdan gelen veriyi çalışma zamanında doğrulamaz. Örneğin dışarıdan gelen değer
unknown olarak ele alınabilir ve kullanılmadan önce karşılaştırılabilir:
Kod:
function siparisDurumuMu(value: unknown): value is SiparisDurumu {
return value === SiparisDurumlari.Bekliyor ||
value === SiparisDurumlari.Hazirlaniyor ||
value === SiparisDurumlari.Tamamlandi;
}
const gelenDeger: unknown = "bekliyor"; // Varsayımsal API değeri
if (siparisDurumuMu(gelenDeger)) {
durumYazdir(gelenDeger);
} else {
console.error("Geçersiz sipariş durumu");
}
Bu örneği nesne ve fonksiyon tanımlarının altına eklediğinizde
bekliyor yazdırılır; değer "iptal" olsaydı hata mesajı görülürdü. Nesneye yeni durum eklediğinizde doğrulama koşulunu da güncelleyin. Bir değeri yalnızca tip dönüşümüyle SiparisDurumu olarak işaretlemek, onun gerçekten geçerli olduğunu kanıtlamaz.