- Konu sahibi
- #1
İlk tercih olarak çoğu TypeScript projesinde
Aşağıdaki örnekte sabit değerler
Burada
Örnekte
İ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
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.
Yalnızca tip kontrolü istiyorsanız nesneye de gerek olmayabilir:
Bu yaklaşımın sınırı, çalışma zamanında
Buna karşılık yeni bir uygulamada yalnızca adlandırılmış sabitler ve sınırlı değerler gerekiyorsa nesne +
Örneğin mevcut kodunuz şöyleyse:
Bunu şu yapıya çevirebilirsiniz:
Sonraki adımda
Bu nedenle genel kural şudur: Yeni kodda varsayılan olarak nesne +
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şım | Neden |
|---|---|---|
| Sabit değerler ve tür güvenliği | Nesne + as const | JavaScript nesnesi olarak çalışır, değer türleri korunur. |
| Yalnızca sınırlı bir metin değerleri kümesi | String birleşim türü | Çalışma zamanında nesne üretmeden tür kısıtlaması sağlar. |
| Üçüncü taraf API veya mevcut kod enum istiyor | enum | Beklenen çalışma zamanı sözleşmesi korunur. |
| Sayısal değerden üye adına dönme ihtiyacı | enum veya açık eşleme nesnesi | Ters dönüşüm gerekiyorsa bunu özellikle tanımlamak gerekir. |
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.