Sorunun tarihi: JavaScript'te, işlevler genellikle imza içinde nesnelerin yapısını kullanarak parçalanır. TypeScript'te bu yaklaşım, parçalanacak parametrelerin yapısının kesin bir şekilde tanımlanmasını ve varsayılan değerlerin belirtilmesini gerektirir; aksi takdirde, mevcut olmayan özelliklere erişim sırasında hatalar ve yanlış tip çıkışları meydana gelebilir.
Problem: Parçalanan nesnedeki tüm parametrelerin veya belirli iç özelliklerin doğru tipini tanımlamanın ne kadar zor olduğudur, özellikle isteğe bağlı ve iç içe alanlar ile varsayılan değerler olduğunda.
Çözüm: Her zaman işlev parametrelerinin yapısı için ayrı bir tip veya arayüz tanımlayın, hangi alanların zorunlu, hangi alanların isteğe bağlı olduğunu açıkça belirtin ve varsayılan değerleri işlevin gövdesinde veya doğrudan parametrelerde ES6 söz dizimi kullanarak tanımlayın.
Kod örneği:
interface UserOptions { name: string; age?: number; address?: { city: string; zipcode?: string }; } function registerUser( { name, age = 18, address = { city: 'Unknown' } }: UserOptions ): string { return `${name}, ${age}, ${address.city}`; }
Anahtar özellikler:
Parametre nesnesinin tip tanımını atlayabilir miyim - otomatik çıkışa güvenerek?
Hayır, bu tehlikeli. UserOptions tipini belirtmezseniz, derleyici zorunlu özellikler hakkında bilgi vermeyecek, varsayılan değerler iç alanlar için etkilenmeyecek ve kullanma aşamasında örtük hatalar ortaya çıkacaktır.
function example({ x, y }) { ... } // x ve y - any
İç içe nesne için varsayılan bir değer nasıl verilir, kısmen özellikleri değiştirerek?
Spread kullanın. Ancak spread, eğer address tipi isteğe bağlıysa, tipleri "birleştirmez". Kontrol etmeniz ya da varsayılan değeri açıkça belirtmeniz gerekir.
function fn({ obj = { foo: 1 } }: { obj?: { foo: number } }) { const address = { foo: 42, ...obj }; }
Varsayılan değeri olmayan isteğe bağlı alanlarla parçalanmanın tehlikesi nedir?
Eğer isteğe bağlı alanlarda varsayılanı atlarsanız, özelliklere (örneğin, address.city) erişimler çalışma zamanı hatalarına neden olabilir. Daha iyi bir şekilde ? işaretini ve varsayılanı açıkça koymak.
function danger({ address }: { address?: { city: string } }) { console.log(address.city); // Hata, address undefined olabilir }
Eski kodda, parametre nesnesini belirgin tip vermeden parçalanıyordu. İşleve yeni bir alan eklenince, tüm kullanım yerleri otomatik olarak bulunamadı ve üretimde çağrılar kırıldı.
Artılar:
Eksiler:
Bu tür tüm işlevler için arayüzler uyguladık, undefined ve varsayılan değerlerle senaryoları testlerle kapsadık, derleyici ipuçları toplu değişiklikler yapmamıza olanak tanıdı.
Artılar:
Eksiler: