Optionele functieparameters worden aangegeven met een vraagteken (?) na de naam van de parameter. Dit geldt ook voor optionele eigenschappen in objecten (interfaces of 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:
Als een functie is gedeclareerd met een optionele parameter van het type string (function fn(x?: string)), kan deze dan expliciet worden aangeroepen met undefined? Wat is het verschil tussen fn() en fn(undefined)?
Antwoord: Ja, het kan worden aangeroepen met undefined: fn(undefined) en fn() — het resultaat is hetzelfde, maar binnenin krijgt de functie x === undefined. Maar als er een standaardwaarde is gedefinieerd in de handtekening:
function fn(x: string = 'demo') { console.log(x); } fn(); // demo fn(undefined); // demo fn('abc'); // abc
Als de parameter niet als optioneel is gedefinieerd (geen ? of standaardwaarde), zal het aanroepen van fn() een compilatiefout geven.
Verhaal
In de interface user werd de eigenschap phone: string (zonder ?), maar deze werd vergeten toe te voegen bij het aanmaken van een instantie van het object. Uiteindelijk begon de TypeScript-compiler te klagen over het ontbreken van de vereiste eigenschap. Een tijdelijke oplossing was om phone: undefined toe te voegen, maar dit was tegenstrijdig met het type, aangezien string !== undefined, wat leidde tot nog meer validatiefouten.
Verhaal
Er waren verschillende optionele parameters in een functie gedefinieerd, maar ze waren niet aan het einde van de argumentenlijst geplaatst. TypeScript gaf hierbij een fout, en bij het herschikken van de parameters veranderde de volgorde van de overeenkomst tussen de doorgegeven waarden en de parameters, wat leidde tot verwarring en onjuiste werking van de functie.
Verhaal
Optionele velden in interfaces werden vergeten bij het beschrijven van het gegevenstype voor een externe API (bijvoorbeeld, achternaam klant? string), waardoor bij wijziging van het schema aan de ene kant deze velden niet meer binnenkwamen, en aan de andere kant de code begon te falen bij de poging om ze te lezen zonder controle op undefined.