Al mirar el código fuente de una regla tslint, me encontré con la siguiente declaración:
if (node.parent!.kind === ts.SyntaxKind.ObjectLiteralExpression) {
return;
}
Observe el !
operador después node.parent
. ¡Interesante!
Primero intenté compilar el archivo localmente con mi versión actualmente instalada de TS (1.5.3). El error resultante apuntó a la ubicación exacta de la explosión:
$ tsc --noImplicitAny memberAccessRule.ts
noPublicModifierRule.ts(57,24): error TS1005: ')' expected.
A continuación, actualicé al último TS (2.1.6), que lo compiló sin problemas. Por lo tanto, parece ser una característica de TS 2.x. Pero la transpilación ignoró por completo la explosión, lo que resultó en el siguiente JS:
if (node.parent.kind === ts.SyntaxKind.ObjectLiteralExpression) {
return;
}
Mi Google fu hasta ahora me ha fallado.
¿Qué es el operador de signo de exclamación de TS y cómo funciona?
fuente
console.assert()
en la variable en cuestión antes de agregar un!
después. Debido a que add!
le dice al compilador que ignore la verificación nula, compila a noop en javascript. Entonces, si no está seguro de que la variable no sea nula, es mejor que haga una verificación explícita de afirmación.dict.has(key) ? dict.get(key) : 'default';
el compilador TS no puede inferir que laget
llamada nunca devuelve nulo / indefinido.dict.has(key) ? dict.get(key)! : 'default';
estrecha el tipo correctamente.La respuesta de Louis es excelente, pero pensé que trataría de resumirla sucintamente:
El operador de explosión le dice al compilador que relaje temporalmente la restricción "no nula" que de otro modo podría exigir. Le dice al compilador: "Como desarrollador, sé mejor que tú que esta variable no puede ser nula en este momento".
fuente
var
olet
están implícitamente inicializadas enundefined
. Además, las propiedades de instancia de clase se pueden declarar como tales, por lo queclass C { constructor() { this.myVar = undefined; } }
es perfectamente legal. Finalmente, los ganchos del ciclo de vida dependen del marco; por ejemplo, Angular y React los implementan de manera diferente. Por lo tanto, no se puede esperar que el compilador de TS razone sobre ellos.