node.js - Typescript: instanceof-kontroll gör ingen smart typkonvertering


Jag har en händelselyssnaråteruppringning som så här:

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

Nu behöver jag kasta target till Element. Varför kompilerar detta:

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

... men det här gör inte det?

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

Svar #1

variable instanceof XYZ är en enda operation som ger ett boolean-värde. Den kan inverteras genom att lägga till parenteser: !(target instanceof Element). När du gör target! instanceof Element anropar du icke-null-assertionsoperatorn i TypeScript på target, vilket är en kompileringstid-assertion.

t.ex.

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