typescript - tres - En Typecript, ¿cuál es el!(signo de exclamación/explosión) al desreferenciar a un miembro?
signos de interrogacion y exclamacion ejemplos (2)
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;
}
Note el
!
operador después de
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 fu de Google hasta ahora me ha fallado.
¿Qué es el operador de signo de exclamación de TS y cómo funciona?
Ese es el operador de aserción no nulo.
Es una manera de decirle al compilador "esta expresión no puede ser
null
o
undefined
aquí, así que no se queje de la posibilidad de que sea
null
o
undefined
".
A veces, el verificador de tipo no puede tomar esa determinación por sí mismo.
Se explica here :
Un nuevo
!
El operador de expresión posterior al arreglo puede usarse para afirmar que su operando no es nulo y no está definido en contextos donde el verificador de tipo no puede concluir ese hecho. Específicamente, la operaciónx!
produce un valor del tipo dex
connull
eundefined
excluido. Similar a las aserciones de tipo de las formas<T>x
yx as T
, el!
El operador de aserción no nulo simplemente se elimina en el código JavaScript emitido.
Encuentro el uso del término "afirmar" un poco engañoso en esa explicación. Es "afirmar" en el sentido de que el desarrollador lo está afirmando , no en el sentido de que se va a realizar una prueba. La última línea de hecho indica que no se emite ningún código JavaScript.
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".