打字稿:instanceof检查不是聪明的演员

问题描述

我有一个事件侦听器回调,如下所示:

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

现在,我需要将目标强制转换为Element。 为什么编译:

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
    }
}

解决方法

variable instanceof XYZ是产生boolean值的单个操作。可以通过添加括号!(target instanceof Element)来反转它。当您执行target! instanceof Element时,您正在target上的TypeScript中调用非空声明操作符,这是一个编译时声明。

例如

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