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 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)
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:
Eksiler:
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:
Eksiler: