TypeScript - Opsiyonel olarak tip verilmiş hemen ayrıştırılmış parametreler?
Opsiyonel olarak yazılmış ve hemen parçalanmış tipli parametreleri nasıl yazarım?
Bir örnek vermek gerekirse, aşağıdaki fonksiyonun herhangi bir parametre vermeden çağrılabilir olmasını istiyorum.
const foo = ({bar}: {bar?: boolean}) => {};
Şu anki haliyle, TypeScript bir parametrenin eksik olduğunu söylüyor.
Cevap #1
Muhtemelen aşağıdaki hatadan dolayı mutsuzsunuz:
const fooBad = ({ bar }?: { bar?: boolean }) => {}; // error!
// ┌──────────> ~~~~~~~~~~~~~~~~~~~~~~~~~~~
// A binding pattern parameter cannot be optional in an implementation signature.
Bu mantıklı, çünkü undefined değerini ayrıştıramazsınız. TypeScript'te yapabileceğiniz şey ise varsayılan bir fonksiyon parametresi kullanmaktır. Bu, fonksiyonun çağıran tarafında isteğe bağlı bir parametre gibi muamele görür (yani boş bırakabilirsiniz) ve uygulanma tarafında parametre undefined ise bir değer atar.
Peki, biri foo() çağırırsa neyi yıkmak istiyorsunuz? Sanırım bar'ın undefined olmasını istiyorsunuz, değil mi? Bu da demek oluyor ki ya {bar: undefined} gibi bir şey ileteceksiniz ya da (bar isteğe bağlı olduğundan) boş nesne {}:
const foo = ({ bar }: { bar?: boolean } = {}) => {
console.log(bar);
};
Çağırdığınızda ne hale geldiğini görebilmeniz için console.log(bar) ekledim:
foo(); // undefined
foo({}); // undefined
foo({bar: true}); // true
Bana güzel görünüyor. Umarım yardımcı olur; iyi şanslar!
Koda bağlantı
Cevap #2
Bu mümkün değil, çünkü JavaScript'te de çalışmıyor. Örneğin, bu JS parçasına bakın:
const foo = ({bar}) => {
...
};
foo({ bar: 123 }); // works
foo(); // error
foo fonksiyonunu bir nesne parametresi olmadan çağırmak bu istisna ile sonuçlanacaktır:
Uncaught TypeError: Cannot destructure property `bar` of 'undefined' or 'null'.
Bu, yukarıdaki fonksiyon implementasyonu neredeyse şunu yazmakla aynı olduğundan olur:
const foo = (arg1) => {
let bar = arg1.bar;
};
foo();
İstisna burada neredeyse aynı olurdu, çünkü arg1.bar, undefined olan bir nesne üzerindeki bir özelliğe erişmeye çalışır.
Uzun lafın kısası, JavaScript çalışma zamanında 'opsiyonel' parametreleri bilmez, bu nedenle TypeScript de onları izin vermez.
