En regardant le code source pour une règle tslint, je suis tombé sur la déclaration suivante:
if (node.parent!.kind === ts.SyntaxKind.ObjectLiteralExpression) {
return;
}
Remarquez l' !
opérateur après node.parent
. Intéressant!
J'ai d'abord essayé de compiler le fichier localement avec ma version de TS actuellement installée (1.5.3). L'erreur résultante indiquait l'emplacement exact du coup:
$ tsc --noImplicitAny memberAccessRule.ts
noPublicModifierRule.ts(57,24): error TS1005: ')' expected.
Ensuite, je suis passé au dernier TS (2.1.6), qui l'a compilé sans problème. Il semble donc être une fonctionnalité de TS 2.x. Mais la transpilation a complètement ignoré le bang, résultant en le JS suivant:
if (node.parent.kind === ts.SyntaxKind.ObjectLiteralExpression) {
return;
}
Mon Google fu m'a jusqu'ici échoué.
Qu'est-ce que l'opérateur de point d'exclamation de TS et comment fonctionne-t-il?
la source
console.assert()
sur la variable en question avant d'ajouter un!
après. Parce que add!
indique au compilateur d'ignorer la vérification nulle, il compile vers noop en javascript. Donc, si vous n'êtes pas sûr que la variable n'est pas nulle, il vaut mieux faire une vérification d'assertion explicite.dict.has(key) ? dict.get(key) : 'default';
le compilateur TS ne peut pas inférer que l'get
appel ne renvoie jamais null / undefined.dict.has(key) ? dict.get(key)! : 'default';
rétrécit le type correctement.La réponse de Louis est excellente, mais j'ai pensé que j'essaierais de résumer succinctement:
L'opérateur bang dit au compilateur de relâcher temporairement la contrainte "non nulle" qu'il pourrait autrement exiger. Il dit au compilateur: "En tant que développeur, je sais mieux que vous que cette variable ne peut pas être nulle pour le moment".
la source
var
oulet
sont implicitement initialisées àundefined
. De plus, les propriétés d'instance de classe peuvent être déclarées comme telles, elles sont doncclass C { constructor() { this.myVar = undefined; } }
parfaitement légales. Enfin, les hooks du cycle de vie dépendent du framework; par exemple, Angular et React les implémentent différemment. On ne peut donc pas s'attendre à ce que le compilateur TS raisonne à leur sujet.