Есть ли разница между утверждениями типа и более новым оператором `as` в TypeScript?

143

Есть ли разница между тем, что спецификация TypeScript называет утверждением типа:

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

И новый as оператор:

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

Оба из которых обычно используются для приведения во время компиляции?

тип машины
источник

Ответы:

168

Разница в том, что as Circleработает в файлах TSX, но <Circle>конфликтует с синтаксисом JSX. asбыл введен по этой причине.

Например, следующий код в .tsxфайле:

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

Приведет к следующей ошибке:

Ошибка TS17002: Ожидается соответствующий закрывающий тег JSX для «Круга».

Однако все as Circleбудет работать нормально.

Используйте as Circleс этого момента. Это рекомендуемый синтаксис.

Дэвид Шеррет
источник
39

Со страницы Wiki : «Что нового в TypeScript [1.6]»:

Новое .tsxрасширение файла и asоператор

TypeScript 1.6 представляет новое .tsxрасширение файла. Это расширение делает две вещи: оно включает JSX внутри файлов TypeScript и делает новый asоператор методом приведения по умолчанию (устраняя любую неоднозначность между выражениями JSX и оператором приведения префикса TypeScript). Например:

var x = <any> foo; 
// is equivalent to:
var x = foo as any;
Мартин Всетичка
источник