typescript - Varför kan jag inte använda instanceof på en union?


Det tillåter inte en instanceof i det här fallet - varför?

public assign(color: string | ColorProperty | RgbProperty | RgbColor): void {
    super.assign(color);

    if (color instanceof ColorProperty) {

ps - JAG ÄLSKAR fackföreningar!!!

Svar #1

Det är inte helt korrekt att säga att any måste finnas i unionen. Detta fungerar också.

class Foo { } 
class Bar { }

var x: Foo | Bar = new Foo();
if (x instanceof Foo) {
    // this is ok
}

Men detta fungerar inte, även om det inte finns någon union.

var n: number = 123;
if (n instanceof Foo) {
    // compile error
}

Problemet anges i kompileringsfelet.

Vänstersidan av ett 'instanceof'-uttryck måste vara av typen 'any', en objekttyp eller en typparameter.

Så det verkar som att när en union innehåller any, är du alltid tillåten att behandla värdena som om de vore any, vilket betyder att det inte finns några begränsningar vid kompilering. Annars tillåter kompilatorn endast operationer som är tillåtna att tillämpas på någon av de enskilda typerna.

Svar #2

Det verkar som att nyckelordet instanceof måste ha en typ any inkluderad i unionen för att kunna användas inom en funktion.
Min gissning är att kompilatorn behöver hantera fallet där alla dina typkontroller returnerar falskt - och därför härleds typen som any.

function assign(_color: any | string | ColorProperty | RbgProperty) {
    if (_color instanceof ColorProperty) {
    }
    // else may not be a string | ColorProperty | RbgProperty
}

Relaterade artiklar