In Typescript, qual è il! (punto esclamativo / botto) operatore durante la dereferenziazione di un membro?

Quando osservo il codice sorgente per una regola tslint, ho trovato la seguente dichiarazione:

if (node.parent!.kind === ts.SyntaxKind.ObjectLiteralExpression) { return; } 

Notare il ! operatore dopo node.parent . Interessante!

Per prima cosa ho provato a compilare il file localmente con la mia versione attualmente installata di TS (1.5.3). L’errore risultante indicava la posizione esatta del botto:

 $ tsc --noImplicitAny memberAccessRule.ts noPublicModifierRule.ts(57,24): error TS1005: ')' expected. 

Successivamente ho aggiornato l’ultimo TS (2.1.6), che lo ha compilato senza problemi. Quindi sembra essere la caratteristica di TS 2.x. Ma la transpilation ignorò completamente il botto, risultando nel seguente JS:

 if (node.parent.kind === ts.SyntaxKind.ObjectLiteralExpression) { return; } 

Il mio Google Fu mi ha finora fallito.

Cos’è l’operatore di esclamazione di TS e come funziona?

Questo è l’operatore di asserzione non nullo. È un modo per dire al compilatore “questa espressione non può essere null o undefined qui, quindi non lamentarti della possibilità che sia null o undefined .” A volte il correttore di tipi non è in grado di effettuare tale determinazione.

È spiegato qui :

Un nuovo ! l’operatore di espressione post-fix può essere usato per affermare che il suo operando non è nullo e non è indefinito in contesti in cui il correttore di tipi non è in grado di concludere tale fatto. Nello specifico, l’operazione x! produce un valore del tipo di x con escluso null e undefined . Simile al tipo asserzioni delle forms x x as T , the ! l’operatore di asserzione non nulla viene semplicemente rimosso nel codice JavaScript emesso.

Trovo che l’uso del termine “asserire” sia un po ‘fuorviante in quella spiegazione. È “asserire” nel senso che lo sviluppatore lo sta affermando , non nel senso che un test verrà eseguito. L’ultima riga indica infatti che non viene emesso alcun codice JavaScript.

La risposta di Louis è ottima, ma ho pensato di provare a riassumere brevemente:

L’operatore bang dice al compilatore di allentare temporaneamente il vincolo “non nullo” che potrebbe altrimenti richiedere. Dice al compilatore: “Come sviluppatore, so meglio di te che questa variabile non può essere nulla in questo momento”.