Alguma diferença entre asserções de tipo e o operador `as` mais recente no TypeScript?

143

Existe alguma diferença entre o que a especificação TypeScript chama de asserção de tipo:

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

E o operador mais recente as :

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

Ambos são normalmente usados ​​para a conversão em tempo de compilação?

mk.
fonte

Respostas:

168

A diferença é que as Circlefunciona em arquivos TSX, mas <Circle>entra em conflito com a sintaxe JSX. asfoi introduzido por esse motivo.

Por exemplo, o seguinte código em um .tsxarquivo:

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

Resultará no seguinte erro:

erro TS17002: Tag de fechamento JSX correspondente esperado para 'Circle'.

No entanto, as Circlevai funcionar muito bem.

Use a as Circlepartir de agora. É a sintaxe recomendada .

David Sherret
fonte
39

Na página Wiki : "O que há de novo no TypeScript [1.6]":

Nova .tsxextensão e asoperador de arquivo

O TypeScript 1.6 apresenta uma nova .tsxextensão de arquivo. Essa extensão faz duas coisas: habilita o JSX dentro dos arquivos TypeScript e torna o novo asoperador a maneira padrão de transmitir (removendo qualquer ambiguidade entre as expressões JSX e o operador de conversão de prefixo TypeScript). Por exemplo:

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