Les paramètres optionnels des fonctions sont indiqués avec un point d'interrogation (?) après le nom du paramètre. Il en va de même pour les propriétés optionnelles dans les objets (interfaces ou types).
function greet(name?: string) { console.log(`Hello, ${name ?? 'stranger'}`); } greet(); // Hello, stranger greet('John'); // Hello, John
interface User { id: number; nickname?: string; } const u1: User = { id: 1 }; const u2: User = { id: 2, nickname: 'Bob' };
Nuances :
Si une fonction est déclarée avec un paramètre optionnel de type string (function fn(x?: string)), peut-on l'appeler explicitement avec undefined ? Quelle est la différence entre fn() et fn(undefined) ?
Réponse : Oui, on peut appeler avec undefined : fn(undefined) et fn() produisent le même résultat, mais à l'intérieur, la fonction recevra x === undefined. Mais si une valeur par défaut est définie dans la signature :
function fn(x: string = 'demo') { console.log(x); } fn(); // demo fn(undefined); // demo fn('abc'); // abc
Et si l'argument n'est pas défini comme optionnel (pas de ? ou de valeur par défaut), l'appel de fn() sera une erreur de compilation.
Histoire
Dans l'interface user, nous avons indiqué la propriété phone: string (sans ?), mais avons oublié de l'ajouter lors de la création de l'instance de l'objet. En conséquence, le compilateur TypeScript a commencé à se plaindre de l'absence d'une propriété obligatoire. Comme solution temporaire, nous avons ajouté phone: undefined, mais cela contredisait le type, car string !== undefined, et a provoqué encore plus d'erreurs de validation.
Histoire
Plusieurs paramètres optionnels ont été définis dans la fonction, mais ils n'ont pas été placés à la fin de la liste des arguments. TypeScript a alors généré une erreur, et en réorganisant les paramètres, l'ordre des valeurs passées aux paramètres a changé, ce qui a conduit à de la confusion et à un fonctionnement incorrect de la fonction.
Histoire
Les champs optionnels dans les interfaces ont été oubliés lors de la description du type de données pour l'API externe (par exemple, nom de famille du client ? string), ce qui a conduit à l'absence de ces champs lors du changement de schéma d'un côté, et de l'autre, le code a commencé à échouer lors de la tentative de lecture sans vérifier si c'était undefined.