Typescript: instanceof check не выполняет интеллектуальное приведение

#node.js #typescript #casting #return #instanceof

#node.js #typescript #Кастинг #Возврат #instanceof

Вопрос:

У меня есть обратный вызов прослушивателя событий следующим образом:

 function(ev: Event) {
    var userBox = id("user-box");
    var target = ev.target;
    // here
}
  

Теперь мне нужно привести цель к элементу.
Почему это компилируется:

 function(ev: Event) {
    var userBox = id("user-box");
    var target = ev.target;
    if (target instanceof Element) {
        if (userBox.contains(target)) {
            // do something
        }
    }
}
  

… но это не так?

 function(ev: Event) {
    var userBox = id("user-box");
    var target = ev.target;
    if (target !instanceof Element) {
        return;
    }
    if (userBox.contains(target)) {
        // do something
    }
}
  

Комментарии:

1. Потому что это синтаксическая ошибка (в JavaScript) или оператор неутверждения null (в TypeScript). instanceof является инфиксным оператором , он ожидает, что его операнды будут слева и справа от него. Вам нужно if (!(target instanceof Element)) .

Ответ №1:

variable instanceof XYZ это единственная операция, которая выдает boolean значение. Его можно инвертировать, добавив круглые скобки : !(target instanceof Element) . Когда вы это делаете target! instanceof Element , вы вызываете ненулевой оператор утверждения в TypeScript on target , который является утверждением во время компиляции.

Например.

 function(ev: Event) {
    var userBox = id("user-box");
    var target = ev.target;
    if (!(target instanceof Element)) {
        return;
    }
    if (userBox.contains(target)) {
        // do something
    }
}
  

Комментарии:

1. Очень хороший момент в аспекте TypeScript этого вопроса и почему это не синтаксическая ошибка!

2. Ти Джей Краудер только что прокомментировал это под основным сообщением, спасибо, ребята! Отметит это как решенное через 9 минут.

3. @julkali — Да, но краткое изложение указало, почему вы не получили синтаксическую ошибку. Сначала я вроде как забыл, что вы используете TypeScript. 😀