ProgramlamaFrontend Geliştirici

TypeScript'te typeof operatörünün nasıl çalıştığını, ne amaçla kullanıldığını ve hangi sınırlamaları olduğunu açıklayın.

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

Cevap.

Soru Tarihi

JavaScript'te typeof operatörü, çalıştırma sırasında ilkel değerlerin türünü kontrol etmek için kullanılır. TypeScript, bu mekanizmayı genişleterek, tür korumaları (type guards) aracılığıyla tür daraltma (type narrowing) sisteminin bir parçası haline getirir. TypeScript, typeof operatörünün sonucunu, kod bloğu içindeki bir değişkenin türünü netleştirmek için kullanır, bu da özellikle union türleri ile çalışırken fonksiyonun mantığını daha doğru bir şekilde tanımlamayı sağlar.

Sorun

Normal JavaScript'te, typeof ile bir değer türü kontrol edildikten sonra tür garantisi olamaz — programcı, kodun hangi bölümünde ne olduğunu hatırlamak zorundadır. Ancak, TypeScript'te durum, farklı türlerin ve union türlerinin bulunmasıyla karmaşıklaşır ve doğru tür daraltması olmadan kolayca hata yapılabilir; örneğin, var olmayan bir metoda erişmeye çalışmak. Ayrıca, operatörün belirli sınırlamaları vardır: yalnızca temel ilkel türleri "görebilir"; örneğin, diziler ve nesneler için 'object' döner.

Çözüm

TypeScript, typeof operatörünü kendi tür analizi ile birleştirerek bir değişkenin türünü kod bloğu içinde daraltmaya imkan tanır. Bu, güvenliği otomatik olarak artırır — derleyici, kodun hangi türle çalıştığını bilir ve olası özellikleri ve metodları önerir.

Kod örneği:

function printId(id: number | string) { if (typeof id === 'string') { // Bu dalda id: string console.log(id.toUpperCase()); } else { // Bu dalda id: number console.log(id.toFixed(2)); } }

Ana özellikler:

  • Yalnızca ilkel türlerle çalışır: 'string', 'number', 'boolean', 'symbol', 'undefined', 'object', 'function', 'bigint'.
  • TypeScript'in union türünü kod bloğu içinde belirli bir ilkel türe daraltmasına yardımcı olur.
  • Dizileri ve nesneleri ayırt etmez, her zaman 'object' döndürür.

Soru Başlıkları

typeof operatörü bir diziyi tanıyabilir mi?

Hayır, bir dizi ve nesne için typeof aynı değeri dönecektir — 'object'. Dizileri ayırt etmek için Array.isArray() metodunu kullanmak daha iyidir.

Kod örneği:

const arr = [1, 2, 3]; console.log(typeof arr); // 'object' console.log(Array.isArray(arr)); // true

typeof ile null ve nesneyi ayırt edebilir miyiz?

Hayır, typeof null 'object' döner, bu JavaScript'in tarihsel bir özelliğidir.

Kod örneği:

console.log(typeof null); // 'object'

typeof ile özel bir sınıfı kontrol edebilir miyiz?

Hayır, sınıf örnekleri için typeof de 'object' dönecektir. Bunun için instanceof operatörü veya özel tür koruma (type guard) fonksiyonları kullanılır.

Kod örneği:

class User {} const u = new User(); console.log(typeof u); // 'object' console.log(u instanceof User); // true

Tür Hataları ve Anti-Desenler

  • Karmaşık veri yapılarının (örneğin diziler, null, nesneler) kontrolü için typeof kullanımı.
  • Türü daha doğru daraltmak için instanceof ve Array.isArray() kullanmaktan kaçınma.
  • Türleri yalnızca çalışma zamanında kontrol etme, statik kontrolü göz ardı etme.

Hayattan Bir Örnek

Olumsuz Durum

Programcı, bir değerin dizi olup olmadığını typeof ile kontrol etmeye çalıştığı bir fonksiyon yazdı ve sonucu temel alarak farklı yöntemler çağırdı.

Artıları:

  • Kod kolayca yazıldı.
  • Ek fonksiyon gerektirmedi.

Eksileri:

  • Dizi geçirildiğinde fonksiyon bozulur: dizi nesne olarak algılanır, çalışma zamanı hataları olur.

Olumlu Durum

Array.isArray kullanımı ve tür koruma ile birleştirilmesi.

Artıları:

  • Güvenli statik türleme.
  • Nesneler ile diziler arasında tür hataları olmaması.

Eksileri:

  • Farklı tür koruma araçlarını hatırlamak gerekir.