İsteğe bağlı işlev parametreleri, parametre adından sonra soru işareti (?) ile belirtilir. Bu durum, nesnelerdeki (arayüzler veya türler) isteğe bağlı özellikler için de geçerlidir.
function greet(name?: string) { console.log(`Merhaba, ${name ?? 'yabancı'}`); } greet(); // Merhaba, yabancı greet('John'); // Merhaba, John
interface User { id: number; nickname?: string; } const u1: User = { id: 1 }; const u2: User = { id: 2, nickname: 'Bob' };
İncelikler:
Eğer işlev isteğe bağlı string parametre ile tanımlanmışsa (function fn(x?: string)), bunu açıkça undefined ile çağırmak mümkün mü? fn() ve fn(undefined) arasındaki fark nedir?
Cevap: Evet, undefined ile çağırmak mümkündür: fn(undefined) ve fn() — sonuç aynıdır, ancak işlev içinde x === undefined olacaktır. Ancak eğer imzada varsayılan bir değer tanımlanmışsa:
function fn(x: string = 'demo') { console.log(x); } fn(); // demo fn(undefined); // demo fn('abc'); // abc
Eğer argüman isteğe bağlı olarak belirtilmemişse (soru işareti yoksa veya varsayılan değeri yoksa), fn() çağrısı bir derleme hatası olacaktır.
Hikaye
User arayüzünde phone: string (soru işareti olmadan) olarak bir özellik belirtildi, ancak nesne örneği oluşturulurken eklemeyi unuttular. Sonuç olarak, TypeScript derleyicisi zorunlu özelliklerin eksikliği nedeniyle hata vermeye başladı. Geçici bir çözüm olarak phone: undefined eklemeye çalıştılar, ancak bu tip ile çelişiyordu, çünkü string !== undefined ve bu validasyon hatalarının daha da artmasına neden oldu.
Hikaye
Bir işlevde birkaç isteğe bağlı parametre tanımlandı, ancak bunlar argüman listesinin sonunda yer almadı. Bu durumda TypeScript hata verdi ve parametrelerin sırasının değiştirilmesi, geçen değerlerin parametrelerle örtüşüm sırasını değiştirdi, bu da karışıklığa ve işlevin yanlış çalışmasına neden oldu.
Hikaye
İnterface'lerde isteğe bağlı alanlar, dış API için veri türü açıklanırken unutuldu (örneğin, müşterinin soyadı? string), bu nedenle bir tarafı şemayı değiştirirken bu alanlar gelmeyi durdurdu, diğer tarafta ise kod, bunları kontrol etmeden okumaya çalıştığında çökmeye başladı.