Salvo

WFN Üye
Konular
1,759
Mesajlar
1,781
Çözüm
0
Ticaret Puanı
0
Üyelik
6 Ay 17 Gün
Konum
İstanbul
Web Sitesi
Yok
Alanı
Belirtmemiş
1/1
Konu sahibi
TypeScript’te 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ırlamakLiteral birleşim tipi
İsimli sabitlere veya değer nesnesine çalışma zamanında erişmekas const nesnesi ve türetilmiş tip
Mevcut enum davranışına veya sayısal ters eşlemeye ihtiyaç duymakEnum kullanmayı sürdürmek
Bu yapılar her durumda bire bir eşdeğer değildir. Örneğin sayısal 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.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Foruma git ?

Bu konuyu görüntüleyen kullanıcılar

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic