ProgramlamaFrontend Geliştirici

TypeScript'te const enum'lar neden gereklidir ve nasıl çalışır? Normal enum'lardan ne farkı vardır ve kullanımlarında hangi tuzaklar ve sınırlamalar vardır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Sorunun Tarihi:

Enum — C/C++ ve diğer dillerden gelen, sonlu adlandırılmış sabit kümesini tanımlamak için kullanılan bir türdür. JavaScript'te yoktu, ancak TypeScript'te desteklenmiştir. Performansı artırmak için const enum ortaya çıkmıştır — bu uzantı, değerlerin derleme aşamasında doğrudan yerleştirildiği ve tam nesne olarak değil çalıştığı bir durumdur.

Problemi:

Normal enum'lar, JS'de önemli miktarda yardımcı kod (isim<->değer çiftini sağlayan nesneler) üretir. Bu her zaman gerekli değildir, özellikle maksimum performans ve minimum bundle boyutu önemliyse.

Çözüm:

Değerleri derleme aşamasında inlined etmek ve gereksiz koddan kaçınmak için const enum kullanın. Ancak const enum'ların bazı sınırlamaları vardır — yalnızca TypeScript projesi içinde çalışır, farklı modüllere transpile edilirken zordur ve tree shaking ile import/export konusunda sorunlar olabilir.

Kod örneği:

const enum Direction { Up, Down, Left, Right } const move = Direction.Left; // JS'de sadece 2'ye dönüşecek

Anahtar Özellikler:

  • Değerler, enum nesnesini oluşturmadan doğrudan yerleştirilir.
  • Enum içinde karmaşık değerler veya hesaplamalar desteklenmez.
  • İhraç edilemez (çoğunlukla kütüphanelerde veya isolatedModules ile kullanımda hatalar oluşur).

Tuzak Sorular.

const enum'lar d.ts dosyalarında ve açık kaynak kütüphanelerde kullanılabilir mi?

Hayır. Kütüphanelerde const enum'ları kullanmaktan kaçınılması önerilir, çünkü yalnızca derleme sırasında inlined edilirler ve bu genellikle yeniden derleme ve tür tanımlama sırasında hatalara neden olur.

const enum'ı isolatedModules parametresi ile kullanırsanız veya babel ile derlerseniz ne olur?

Bir hata meydana gelir: babel ve isolatedModules, const enum'ların inlining'ini desteklemez, çünkü bir dosyanın derleme aşamasında değerlerin güvenli bir şekilde yerleştirileceğini garanti edemezler.

const enum'da hesaplanan değerler ve string değerler kullanılabilir mi?

Karmaşık hesaplamalar (örneğin, fonksiyonlar veya değişkenler aracılığıyla ifadeler) yasaktır. Sadece basit sayılar ve stringler kullanabilirsiniz.

Tipik Hatalar ve Anti-Modeler

  • Kütüphanenin genel API'sinde veya .d.ts dosyalarında const enum kullanımı.
  • const enum inlining desteği olmadan transpile etme (örneğin, özel bir eklenti olmadan babel ile).
  • Basitler yerine karmaşık ifadeler ve string değerlerin eklenmesi.

Gerçek Hayat Örneği

Olumsuz Durum

Kütüphanede const enum yayınlandı, .d.ts dosyasında tanımlandı, tüketici sonuç bundle'ında eksik import satırından dolayı hata aldı.

Artıları:

  • Hızlı çalışma, bağımlı projelerde gereksiz kod yok.

Eksileri:

  • Kullanıcılar için derleme ve runtime hataları.

Olumlu Durum

Const enum'ı yalnızca projenin özel kısımlarında kullanarak dışa aktarmadık:

const enum Color { Red, Green, Blue } let arr = [Color.Red, Color.Green];

Artıları:

  • Kompakt çıkış JS kodu.
  • Güvenlik ve destek kolaylığı garantisi.

Eksileri:

  • Dışa aktarılamaz.