Beim Durchsuchen des Quellcodes nach einer tslint-Regel stieß ich auf die folgende Aussage:
if (node.parent!.kind === ts.SyntaxKind.ObjectLiteralExpression) {
return;
}
Beachten Sie den !
Bediener nach node.parent
. Interessant!
Ich habe zuerst versucht, die Datei lokal mit meiner aktuell installierten Version von TS (1.5.3) zu kompilieren. Der resultierende Fehler zeigte auf die genaue Position des Knalls:
$ tsc --noImplicitAny memberAccessRule.ts
noPublicModifierRule.ts(57,24): error TS1005: ')' expected.
Als nächstes habe ich auf den neuesten TS (2.1.6) aktualisiert, der ihn ohne Probleme kompiliert hat. Es scheint also ein Merkmal von TS 2.x zu sein. Aber die Transpilation ignorierte den Knall vollständig, was zu folgendem JS führte:
if (node.parent.kind === ts.SyntaxKind.ObjectLiteralExpression) {
return;
}
Mein Google Fu hat mich bisher gescheitert.
Was ist der Ausrufezeichenoperator von TS und wie funktioniert er?
quelle
console.assert()
betreffende Variable vor dem Anhängen einer nachfolgenden Variablen zu bearbeiten!
. Da add!
den Compiler anweist, die Nullprüfung zu ignorieren, wird es in Javascript zu noop kompiliert. Wenn Sie also nicht sicher sind, ob die Variable nicht null ist, führen Sie besser eine explizite Assert-Prüfung durch.dict.has(key) ? dict.get(key) : 'default';
dem TS-Compiler kann nicht darauf schließen, dass derget
Aufruf niemals null / undefiniert zurückgibt.dict.has(key) ? dict.get(key)! : 'default';
schränkt den Typ korrekt ein.Louis 'Antwort ist großartig, aber ich dachte, ich würde versuchen, es kurz und bündig zusammenzufassen:
Der Bang-Operator weist den Compiler an, die Einschränkung "nicht null", die er sonst möglicherweise verlangt, vorübergehend zu lockern. Dem Compiler heißt es: "Als Entwickler weiß ich besser als Sie, dass diese Variable momentan nicht null sein kann."
quelle
var
oderlet
implizit mit initialisiertundefined
. Darüber hinaus können Klasseninstanzeigenschaften als solche deklariert werden,class C { constructor() { this.myVar = undefined; } }
was vollkommen legal ist. Schließlich sind Lifecycle-Hooks vom Framework abhängig. Zum Beispiel implementieren Angular und React sie unterschiedlich. Es ist daher nicht zu erwarten, dass der TS-Compiler darüber nachdenkt.