Salvo

WFN Üye
Konular
1,743
Mesajlar
1,765
Çözüm
0
Ticaret Puanı
0
Üyelik
6 Ay 16 Gün
Konum
İstanbul
Web Sitesi
Yok
Alanı
Belirtmemiş
1/1
Konu sahibi
İlk tercih olarak çoğu TypeScript projesinde enum yerine as const ile sabit bir nesne ve bu nesneden türetilen birleşim türü kullanabilirsiniz. Böylece değerleri çalışma zamanında normal JavaScript nesnesi olarak alır, tür güvenliğini korur ve TypeScript’e özgü çalışma zamanı kodu üretmezsiniz. Ancak dış bir API’nin enum biçimiyle çalışması, ters eşleme gereksinimi veya belirli bir kütüphanenin enum beklemesi gibi bir koşul varsa enum hâlâ uygun olabilir.

Çoğu durumda kullanılacak yapı​


Aşağıdaki örnekte sabit değerler 方向 nesnesinde tutuluyor. as const, özelliklerin genel string veya number yerine kendi sabit değer türlerini korumasını sağlar.

Kod:
const Direction = {
  Up: "up",
  Down: "down",
  Left: "left",
  Right: "right",
} as const;

type Direction = typeof Direction[keyof typeof Direction];

function move(direction: Direction): string {
  return `Hareket yönü: ${direction}`;
}

move(Direction.Left); // Geçerli
move("up");          // Geçerli
// move("diagonal"); // Hata: Bu değer Direction türünde değil

Burada Direction nesnesi çalışma zamanında gerçekten vardır; örneğin Direction.Left ifadesi "left" değerini döndürür. Direction türü ise yalnızca "up" | "down" | "left" | "right" değerlerinden oluşur. Bu yapı, enum benzeri sabit adları ve sınırlı değer kümesini birlikte sağlar.

Örnekte move("up") de geçerlidir; çünkü fonksiyon değerin kendisini kabul eder. Yalnızca sabit nesnenin kullanılmasını zorunlu tutmak isterseniz parametreyi Direction yerine nesnenin anahtarlarından türetebilirsiniz:

Kod:
type DirectionName = keyof typeof Direction;

function moveByName(direction: DirectionName) {
  return Direction[direction];
}

moveByName("Left"); // "left"
// moveByName("Diagonal"); // Hata

İlk tür değerleri, ikinci tür ise nesnenin anahtar adlarını temsil eder. Bu ayrım önemlidir: API’ye gönderilecek değer genellikle "left" gibi değer olurken, kullanıcı arayüzünde veya eşleme tablosunda "Left" gibi anahtar adına ihtiyaç duyabilirsiniz.

Hangi seçeneği ne zaman kullanmalı?​


Seçim, yalnızca yazım tercihi değil, çalışma zamanında nasıl bir değer gerektiğiyle ilgilidir. Aşağıdaki ayrım pratikte yeterlidir.
İhtiyaçUygun yaklaşımNeden
Sabit değerler ve tür güvenliğiNesne + as constJavaScript nesnesi olarak çalışır, değer türleri korunur.
Yalnızca sınırlı bir metin değerleri kümesiString birleşim türüÇalışma zamanında nesne üretmeden tür kısıtlaması sağlar.
Üçüncü taraf API veya mevcut kod enum istiyorenumBeklenen çalışma zamanı sözleşmesi korunur.
Sayısal değerden üye adına dönme ihtiyacıenum veya açık eşleme nesnesiTers dönüşüm gerekiyorsa bunu özellikle tanımlamak gerekir.
Yalnızca tip kontrolü istiyorsanız nesneye de gerek olmayabilir:

Kod:
type Status = "pending" | "approved" | "rejected";

function showStatus(status: Status) {
  return status;
}

Bu yaklaşımın sınırı, çalışma zamanında Status.approved gibi bir sabitin bulunmamasıdır; çünkü type tanımları JavaScript’e çevrilmez. Kodun başka yerlerinde tekrar tekrar kullanılacak sabit adlara veya bu değerleri listelemeye ihtiyacınız varsa nesne + as const daha kullanışlıdır.

enum kullanmaya devam etmek ne zaman mantıklı?​


enum, TypeScript tarafından çalışma zamanında bir nesneye dönüştürülür. Bu nedenle mevcut bir kütüphane, API sözleşmesi veya ekip standardı enum nesnesi bekliyorsa sırf alternatif yaklaşım var diye dönüşüm yapmak zorunda değilsiniz. Sayısal enum’larda değerlerden adlara ters eşleme gibi özel davranışlar da bulunabilir; nesne + as const bunu kendiliğinden sağlamaz.

Buna karşılık yeni bir uygulamada yalnızca adlandırılmış sabitler ve sınırlı değerler gerekiyorsa nesne + as const genellikle daha sade bir başlangıçtır. Üretilen JavaScript’in normal JavaScript yapısına yakın kalması, değerlerin JSON veya API isteklerinde açıkça görülmesi ve türün tek bir kaynaktan türetilmesi bakımını kolaylaştırır.

Mevcut enum’u güvenli biçimde dönüştürme​


Örneğin mevcut kodunuz şöyleyse:

Kod:
enum Status {
  Pending = "pending",
  Approved = "approved",
  Rejected = "rejected",
}

Bunu şu yapıya çevirebilirsiniz:

Kod:
const Status = {
  Pending: "pending",
  Approved: "approved",
  Rejected: "rejected",
} as const;

type Status = typeof Status[keyof typeof Status];

Sonraki adımda Status.Pending gibi kullanım noktaları aynı kalır; ancak Status artık enum türü değil, normal bir nesnedir. Fonksiyon parametreleri veya arayüz alanları enum adına bağlıysa bunları yeni birleşim türüyle değiştirin. Derleyici hataları, dönüştürmeyi unuttuğunuz yerleri gösterir. Özellikle veritabanından, URL’den veya kullanıcı girdisinden gelen bir string değerin bu türe atanması otomatik olarak güvenli kabul edilmez; dış girdiyi kullanmadan önce geçerli değerlerden biri olduğunu doğrulamanız gerekir.

Bu nedenle genel kural şudur: Yeni kodda varsayılan olarak nesne + as const kullanın; yalnızca çalışma zamanı enum davranışına veya mevcut bir sözleşmeye gerçekten ihtiyaç duyuyorsanız enum seçin.
 

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