ProgramlamaFullstack geliştirici

TypeScript'te Spread ve Rest operatörlerinin mekanizmasını açıklayın, sıkı tip kontrolü ile nasıl çalıştıklarını ve nesne ve dizilerle çalışırken nelere dikkat edilmesi gerektiğini belirtin?

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

Cevap.

Sorunun geçmişi:

Spread (...) ve Rest (...) — ES6'dan gelen en popüler modern sözdizim yapılarından biridir. TypeScript'te bu yapılar, tip titizliği kazandığı için Spread ve Rest'in kullanımı hem kullanışlı hem de güvenli hale gelmiştir, eğer tip sınırlamalarına dikkat edilirse.

Sorun:

Spread ve Rest işlemleri, değerlerin tipi göz önünde bulundurulmadığında veya uyumsuz türler karıştırıldığında hata kaynakları haline gelir (örneğin, uyumsuz özelliklere sahip nesneler veya farklı türlerdeki diziler birleştirildiğinde).

Çözüm:

TypeScript'te Spread, nesnelerin ve dizilerin özelliklerini veya elemanlarını kopyalamak veya birleştirmek için kullanılır. Rest, işlev veya dizi içinde "artan" elemanları toplamak için kullanılır ve bu süreçte sıkı tip kontrolü, uyumsuz durumları kontrol ederek derleme aşamasında hataları önler.

Kod örneği:

// Nesnelerde Spread const base = { a: 1, b: 2 }; const extended = { ...base, c: 3 }; // extended: { a: number; b: number; c: number } // İşlev parametrelerinde Rest function sum(...args: number[]): number { return args.reduce((acc, val) => acc + val, 0); } // Dizilerde Spread const arr = [1, 2, 3]; const newArr = [...arr, 4, 5];

Ana özellikler:

  • Spread, tür uyumluluğu kontrolü ile özelliklerin/elemanların kopyalanmasını sağlar
  • Rest, artan parametrelerin sıkı tipini garanti eder
  • Yanlış birleştirmelerdeki tip hataları derleme aşamasında tespit edilir

İkna edici soru.

Spread ile nesne kopyalamak, referans atamakla nasıl farklılık gösterir?

Spread, tüm sayılabilir özelliklerin kopyasıyla yeni bir nesne oluşturur, ancak nesnede iç içe geçmiş nesneler varsa, bunlar referansla kopyalanır (shallow copy).

const base = { a: 1, nested: { x: 2 } }; const copy = { ...base }; copy.nested.x = 42; console.log(base.nested.x); // 42

Spread ile yalnızca belirli özellikleri kopyalamak mümkün mü?

Hayır, Spread, nesnenin tüm sayılabilir özelliklerini kopyalar. Belirli bir seçim için destructuring kullanılır:

const { a, ...rest } = { a: 1, b: 2, c: 3 }; // rest: { b: 2, c: 3 }

Aynı özelliklere sahip iki nesneyi Spread ile birleştirirsek ne olur? Bu, tipleri nasıl etkiler?

Son nesneden gelen özellikler, önceki nesnelerin özelliklerini geçersiz kılar. Ayrıca, son özelliğin tipi nihai olarak kabul edilir:

const a = { val: 1 }; const b = { val: 'hello' }; const merged = { ...a, ...b }; // merged: { val: string } (number değil)

Tip hataları ve anti-modeler

  • İç içe geçmiş nesnelerin derin kopyalarını almak için Spread kullanmak, bu yalnızca "shallow copy" olduğu için önerilmez
  • Rest parametrelerinin yanlış tiplendirilmesi (belirli bir tür yerine any[] tipi belirtmek)
  • Kapsayan uyumsuz özellik tiplerine sahip nesneleri birleştirme

Gerçek hayattan bir örnek

Olumsuz durum

Proje, Spread aracılığıyla yapılandırma parametrelerini birleştirmeye karar verdi. Nesnelerden biri timeout: number, diğeri ise timeout: string özelliğine sahipti. Hiçbir hata gözlemlenmedi ve çalıştırma sırasında işlev, yanlış tür nedeniyle hata verdi.

Artılar:

  • Çok kısa bir süre içinde gerçekleştirildi

Eksiler:

  • Aşamada açıkça belirli bir tür olarak any belirlendiğinde tip hataları gözden kaçabilir
  • Özelliklerin örtüşmesinde tuzaklar

Olumlu durum

Sıkı arayüzleri birleştirmek için tipli Spread kullandık ve gereksiz alanları ayırmak için destructuring kullandık. Derleyici hataları hemen ortaya çıkardı.

Artılar:

  • Uyuşmazlık durumlarında otomatik hata kontrolü ve vurgulama
  • Güvenli bir birleştirme ve türün modifikasyonu

Eksiler:

  • Arayüzlerin dikkatli bir şekilde tasarlanması gerekiyor