ProgramlamaFullstack geliştirici

TypeScript'te keyof typeof nedir? Birlikte kullanımları nasıl çalışır ve pratikte nerelerde uygulanır?

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

Cevap.

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.

Sorunun Tarihi

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.

Problem

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.

Çözüm

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:

  • Manuel güncellemeye ihtiyaç duymadan sıkı bağlı key-value türleri oluşturmayı sağlar.
  • Nesne anahtarlarıyla çalışan fonksiyonları türlendirmeyi mümkün kılar.
  • Anahtarlar ve türler arasındaki senkronizasyon problemlerini ortadan kaldırır.

Kandırıcı Sorular.

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) { // ... }

Tipik hatalar ve anti-patternler

  • 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.
  • Açıkça ilan edilmemiş bir tipe uygulanması, türlerin çıkarımını kırar.

Gerçek Hayattan Bir Örnek

Olumsuz Durum

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:

  • Geçerli olan stringlerin ne olduğunu net bir şekilde gösterir.

Eksiler:

  • Liste güncellendiğinde türleri manuel olarak değiştirmeniz gerekir; senkronizasyon sorunları ve hatalar.

Olumlu Durum

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:

  • Bir durum eklendiğinde veya kaldırıldığında tür otomatik olarak güncellenir.
  • Türler ve değerler arasında senkronizasyon sorunu yoktur.

Eksiler:

  • Çok karmaşık yapılarla çalışırken bu türlerin anlaşılması deneyim ve dikkat gerektirir.