Утверждения типа заставляют компилятор принимать вещи, которые не являются безопасными типами.Поэтому, когда вы используете утверждение типа, компилятор примет, что {}
- это Square
, даже если он явно не соответствует интерфейсу.
Когда вы явно аннотируете переменную, let sq: Square
тип определяется аннотацией, и присваивание будет строго проверяться относительно этого типа переменной, и вы получите ошибку, что {}
не соответствуетinterface.
С точки зрения времени выполнения между этими двумя понятиями нет разницы, в обоих случаях после компиляции остается присвоение переменной {}
, типы (как в аннотации, так и в утверждении типа) полностьюстерто компилятором.
Как правило, вам следует избегать утверждений типа.Утверждения типа говорят компилятору: «Игнорируйте то, что вы считаете верным, я программист знаю лучше!».Существуют случаи, когда утверждения типа необходимы, но если вы не уверены, что вам нужно утверждение типа, вам следует избегать их и пытаться исправить положение, чтобы типы были правильными.Используя утверждение типа, вы можете получить удивительные результаты.Например:
interface Square {
width: number
}
let square = <Square>{}
square.width.toExponential() // runtime error, the type did not really reflect the runtime object
let sq:Square = {} // error here at compile time here
sq.width.toExponential()