打字稿:instanceof 检查不智能转换

Typescript: instanceof check doesn't smart cast

我有一个像这样的事件侦听器回调:

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

variable instanceof XYZ 是产生 boolean 值的单个操作。它可以通过添加括号来反转:!(target instanceof Element)。当您执行 target! instanceof Element 时,您将在 target 上调用 TypeScript 中的 non-null 断言运算符,这是一个 compile-time 断言。

例如

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