ProgramlamaFrontend geliştirici

Sabit nesnelerin as const özelliği ile tipleri nasıl çalışır? Yanlış tip kullanımında hangi avantajlar ve sorunlar ortaya çıkabilir?

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

Cevap

as const, TypeScript'te bir nesne/dizi değerini ve özelliklerini readonly ve literal türlere dönüştürür. Bu, değerlerin daha basit bir türe "genişletilmemesini", belirli bir değeri korumasını sağlar.

Örnek:

const a = { status: 'success' }; // Tür: { status: string } const b = { status: 'success' } as const; // Tür: { readonly status: "success" }

Avantajlar:

  • Sıkı tip kontrolü (örneğin, stringlerle switch/case, sabit listeleri)
  • Enums, Redux'daki actionTypes, rol listeleri için mükemmel
  • Değerlerin yanlışlıkla değiştirilmesini engeller

Dezavantajlar/Özellikler:

  • Özellikler readonly yapar, onları değiştirmeye çalışmak hata yaratır.
  • Dikkatsiz kullanım, tür uyuşmazlığına yol açabilir (örneğin, bir string gerekiyorsa, literali geçmeniz durumunda).

Cevap Sınavı

Soru: as const kullanarak bir dizi string oluşturursanız, türü ne olur ve bunu basit bir string[] olarak geçmek mümkün mü?

Cevap: Tür readonly ["a", "b", "c"] olacaktır; yani readonly kısıtlaması olan literal türlerden oluşan bir demet. Bu dizi, string[] türü ile uyumsuzdur; değiştirilebilir bir string dizisi beklenen bir yere doğrudan geçilemez.

const arr = ['a', 'b', 'c'] as const; // readonly ["a", "b", "c"] function acceptsStrings(x: string[]) {} acceptsStrings(arr); // Hata! Tür uyumsuz

Bu konudaki ince detayları bilmemekten kaynaklanan gerçek hata örnekleri


Hikaye

Proje: ActionTypes listelerini as const ile sabit bir dizi olarak depoluyordu, sonra bunu string[] bekleyen bir işlevde geçirmeye çalıştılar. Tür hatası aldılar, açıkça .slice() veya [...arr] ile dönüştürmek zorunda kaldılar.


Hikaye

Proje: Redux mikro çerçevesinde action.type’ı as const ile bir literal olarak tanımladılar. switch-case uygulanırken sıkı tip kontrolünü unuttular, tüm olası literalleri işlemeyi atladılar, bu yüzden exhaustive check çalışmadı — hata, yeni bir eylem eklenene kadar ortaya çıkmadı.


Hikaye

Proje: API uç noktalarını otomatik olarak oluşturulurken, anahtarlarını as const dizisi ile tanımladılar. Bu anahtarları normal bir Record<string, ...> dizisi olarak indekslemeye çalışmak tür uyumsuzluğu nedeniyle başarısız oldu — dönüşüm eklemeleri ya da sabit diziden anahtar türlerini açıkça kullanmaları gerekti.