Разница между приведением к типу интерфейса и простым объявлением с типом - PullRequest
0 голосов
/ 30 декабря 2018

Я читал о интерфейсах в машинописном тексте и обнаружил следующее:

Интерфейс с именем Square определяется следующим образом:

interface Square {
     width: number
}

Затемпеременная с именем square объявляется путем встраивания объекта literat в тип Square:

let square = <Square>{}

Я попытался напечатать square и typeof square, что, как и ожидалось, дает {} и object.Но я не мог отличить приведенное выше определение square от следующего:

let sq: Square = {}

Здесь машинопись выдает ошибку, говоря, что свойство width отсутствует в sq.Чем это отличается от приведенного выше синтаксиса?Вот также фрагмент с машинописной площадки .

1 Ответ

0 голосов
/ 30 декабря 2018

Утверждения типа заставляют компилятор принимать вещи, которые не являются безопасными типами.Поэтому, когда вы используете утверждение типа, компилятор примет, что {} - это 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() 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...