#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. 😀