De Non-Null Assertion Operator (!) is een speciale syntaxis in TypeScript die het de ontwikkelaar mogelijk maakt om de compiler uitdrukkelijk te vertellen: "Ik weet dat de variabele op dit moment niet null of undefined is". De operator is toegevoegd om typeproblemen op te lossen in scenario's waarbij de programmeur zich bewust is van het bestaan van een waarde, maar TypeScript dit niet kan garanderen vanwege zijn strikte analyse.
TypeScript is streng als het gaat om de mogelijkheid dat variabelen null of undefined zijn, vooral wanneer de optie strictNullChecks is ingeschakeld. Om waarschuwingen van de compiler te vermijden in situaties waarin de programmeur zeker is van de veiligheid van een waarde, werd de non-null assertion geïntroduceerd.
TypeScript kan niet altijd alle codepaden volgen en begrijpen dat een voorwaarde voor null niet hoeft te worden uitgevoerd. Dit gebeurt vaak na asynchrone code, in callbacks, bij het verwerken van DOM-elementen.
De Non-Null Assertion Operator (!) geeft de compiler aan dat er geen null/undefined aanwezig is op die plaats, waardoor de typefout wordt verwijderd.
Codevoorbeeld:
function processUser(user?: {name: string}) { // TS geeft een fout zonder de operator: user kan undefined zijn console.log(user!.name); // De !-operator belooft dat user gedefinieerd is }
Belangrijke kenmerken:
Kan ik ! gebruiken voor elke waarde van elk type? Bijvoorbeeld: let x: number = y!
De operator ! heeft alleen zin voor types die volgens de compiler mogelijk null/undefined kunnen bevatten. Voor strikt getypeerde variabelen zonder nullables heeft dit geen effect.
Vervangt ! de controle op null/undefined volledig? Moet ik runtime-controle uitvoeren?
Nee, de !-operator voert geen controles uit tijdens runtime. Het helpt alleen de compiler en als de werkelijke waarde undefined/null blijkt te zijn, zal er een runtime-fout optreden.
function foo(data?: string) { // kan leiden tot een fout alert(data!.length); }
Kan ! helpen om fouten in asynchrone code te voorkomen, als de oorspronkelijke variabele in een andere thread verandert?
Nee. De !-operator werkt alleen op het punt van gebruik. Als de waarde tussen de controle en het gebruik undefined wordt, is de fout onvermijdelijk. Je moet altijd zeker zijn van de actuele niet-null-heid.
Binnen een React-component wordt er naar de DOM verwezen via een ref met de !-operator zonder voorafgaande controle:
const ref = useRef<HTMLDivElement>(null); ref.current!.focus(); // als ref.current null is, zal er een runtime-fout zijn
Voordelen:
Nadelen:
Gebruik van een controle op bestaan voordat het wordt gebruikt:
if (ref.current) { ref.current.focus(); }
Voordelen:
Nadelen: