¿Hay alguna diferencia entre las aserciones de tipo y el nuevo operador `as` en TypeScript?

143

¿Hay alguna diferencia entre lo que la especificación de TypeScript llama una aserción de tipo:

var circle = <Circle> createShape("circle");

Y el operador más nuevo as :

var circle = createShape("circle") as Circle;

¿Ambos se usan típicamente para el casting en tiempo de compilación?

mk.
fuente

Respuestas:

168

La diferencia es que as Circlefunciona en archivos TSX, pero <Circle>entra en conflicto con la sintaxis JSX. asfue introducido por este motivo.

Por ejemplo, el siguiente código en un .tsxarchivo:

var circle = <Circle> createShape("circle");

Resultará en el siguiente error:

error TS17002: Etiqueta de cierre JSX correspondiente esperada para 'Circle'.

Sin embargo, as Circlefuncionará bien.

Usar as Circlede ahora en adelante. Es la sintaxis recomendada .

David Sherret
fuente
39

Desde la página Wiki : "Novedades en TypeScript [1.6]":

Nueva .tsxextensión de archivo y asoperador

TypeScript 1.6 presenta una nueva .tsxextensión de archivo. Esta extensión hace dos cosas: habilita JSX dentro de los archivos TypeScript, y hace que el nuevo asoperador sea la forma predeterminada de emitir (eliminando cualquier ambigüedad entre las expresiones JSX y el operador de conversión de prefijo TypeScript). Por ejemplo:

var x = <any> foo; 
// is equivalent to:
var x = foo as any;
Martin Vseticka
fuente