keyof ve typeof operatörleri, TypeScript'in güçlü tip belirleme araçlarıdır. Birlikte kullanımları, dinamik olarak türleri oluşturmayı, güvenli fonksiyonlar yaratmayı ve nesne yapılarını mümkün olan en esnek şekilde ifade etmeyi sağlar.
TypeScript'te typeof, bir değişkenin türünü çıkarmak için kullanılırken, keyof bir nesnenin veya tipin tüm anahtarlarının birleşimini döner. Birlikte kullanıldıklarında, dinamik olarak tanımlanan nesnelerle çalışmayı ve ilişkili türler oluşturmaya olanak tanır.
Bu operatörler olmadan, nesneler, enum'lar ve eşleme tabloları ile çalışırken, sıklıkla anahtarların stringlerini türlerde ve değerlerde elle tekrar etmek zorunda kalırız, bu da senkronizasyon hatalarına yol açabilir ve kodun bakımını zorlaştırır.
typeof ile bir değişkenin değerinden tür alırken, keyof ile de tüm anahtarlarının birleşim tipini oluşturuyoruz. Sonuç — türlerin otomasyonu.
Kod örneği:
const ERRORS = { NOT_FOUND: 'Bulunamadı', UNAUTHORIZED: 'Yetkisiz', SERVER_ERROR: 'Sunucu hatası', }; // typeof ile tür alıyoruz, keyof ile nesnenin tüm anahtarlarını function getErrorMessage(code: keyof typeof ERRORS): string { return ERRORS[code]; }
Anahtar özellikler:
typeof ile elde edilen nesne değerleri otomatik olarak union-tipi anahtarları haline gelebilir mi?
Hayır, typeof nesne yapısının türünü döndürür, değerleri değil. Değerlerin union'ını elde etmek için değer türlerini ayrı olarak almak gerekir.
enum için typeof ne döndürür ve enum için keyof typeof ne döndürür?
Enum için typeof, enum nesnesinin yapısal türünü döndürür (hem anahtar-değer hem de değer-anahtar yönlerinde), keyof typeof ise bu nesnenin string/numerik anahtarlarının birleşimini verir. Örneğin:
enum Colors { Red = 'K', Blue = 'M' } type ColorKeys = keyof typeof Colors; // 'K' | 'M'
keyof typeof kullanarak, nesne anahtarlarını kabul eden bir fonksiyonun tüm olası parametrelerini type-safe şekilde alabilir miyiz?
Evet, bu şekilde yalnızca geçerli anahtarları kabul eden bir fonksiyon oluşturursunuz. Bu, nesne anahtarlarıyla çalışırken hataları önler.
const config = { mode: 'karanlık', lang: 'tr' }; type ConfigKeys = keyof typeof config; // 'mode' | 'lang' function useConfig(key: ConfigKeys) { // ... }
keyof typeof'ın dizi değerlerine uygulanabileceği yanlış beklentisi — bir dizi için bu indekslerdir, değerler değil.typeof'ın tip düzeyinde çalıştığını ve çalışma zamanında bir değer döndürmediğini anlamamak.API durumları içeren bir sabitte manuel olarak string anahtar türleri tanımlanıyor:
type StatusCodes = 'OK' | 'FAIL' | 'PENDING'; function isKnownStatus(code: StatusCodes) { /* ... */ }
Artılar:
Eksiler:
Listeyi otomatik olarak desteklemek için keyof typeof kullanmak:
const STATUS = { OK: 1, FAIL: 0, PENDING: 2 }; type StatusKeys = keyof typeof STATUS; function checkStatus(key: StatusKeys) { /* ... */ }
Artılar:
Eksiler: