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:
Dezavantajlar/Özellikler:
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
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.