Почему оператор ненулевого утверждения (!) Не генерирует фактические ненулевые и неопределенные проверки в результирующий JS - PullRequest
0 голосов
/ 27 февраля 2019

Кажется, что было бы разумно, чтобы компилятор Typescript отправлял неопределенные и ненулевые проверки в результирующий JS при использовании оператора ненулевого утверждения.То есть:

function fun1(node: SomeType | undefined) {
    fun2(node!);
}

должно быть преобразовано в:

function fun1(node) {
    if (node === undefined || node === null) {
        throw new Error('The non-null assertion failed!');
    }
    fun2(node);
}

Однако, как говорят документы, оно будет просто передано:

function fun1(node) {
    fun2(node);
}

Почему это так?В чем причина не добавлять проверки в выходной код JS?

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Смысл оператора ненулевого утверждения состоит в том, чтобы сообщить компилятору TypeScript, что вы уже знаете, что переменная не равна нулю.Рассмотрим следующий сценарий:

function fun1(node: SomeType | undefined) {
    throwIfUndefined(node);
    node!.fun2();
}

Вы вызываете функцию, которая, как вы знаете, выдает исключение, если node не определено.Таким образом, действительно нет необходимости проверять, является ли узел неопределенным перед вызовом fun2.Однако компилятор TypeScript не может вывести это, поэтому без восклицания он откажется компилировать ваш код, потому что думает, что вы не обрабатывали нулевой регистр.Но если вы, как программист, знаете, что такое условие никогда не произойдет, зачем вставлять избыточную проверку, которая будет стоить циклов ЦП в конечном продукте?Оператор ненулевого утверждения - это на самом деле просто способ сказать компилятору: «Да, я знаю, вы не можете сказать, что эта переменная не будет нулевой, но я так и делаю, убирайтесь с дороги».

Кроме того, какой смысл выдавать ошибку прямо перед кодом, который все равно выдает ошибку?Сообщение типа «Не пустое утверждение не удалось!»не более полезен, чем стандартное нулевое справочное сообщение.

0 голосов
/ 27 февраля 2019

Это утверждение типа, это означает, что вы сообщаете компилятору, что эта переменная не равна нулю, а не просите компилятор проверить эту переменную.В принципе, ваша идея возможна, но выдача ошибки не является целью утверждения типа.И это различие между TypeScript и Javascript (проверка типа и проверка значения)

...