typescript1.4 - Kontrollera om en variabel är av en specifik gränssnittstyp i en typescript-union


Är det möjligt att skapa en typvakt, eller något annat som uppnår samma syfte, för att kontrollera om en variabel är av en specifik gränssnittstyp i en Typescript-union?

interface Foo { a:string }
interface Bar { b:string }

(function() {
    function doStuff(thing: Foo | Bar) {
        if(typeof thing === 'Foo') {
            console.log('Foo');
        } 
        else if (typeof thing === 'Bar') {
            console.log('Bar');
        }
        else {
            console.log('unknown');
        }
    }

    var thing: Foo = {a:'a'};
    doStuff(thing);
})();

Svar #1

Sedan Typescript 1.6 kan du använda användardefinierade typvakter:

let isFoo = (object: Foo| Bar): object is Foo => {
    return "a" in object;
}

Se https://www.typescriptlang.org/docs/handbook/advanced-types.html#user-defined-type-guards och https://github.com/microsoft/TypeScript/issues/10485

Svar #2

typeof gör inte detta. Det returnerar alltid "string", "number", "boolean", "object", "function" eller "undefined".

Du kan testa för objektets egenskaper med ett test som if(thing.a !== undefined) { eller if(thing.hasOwnProperty('a')) {.

Observera att du skulle kunna skapa ett objekt som hade både en sträng a och en sträng b, så var medveten om den möjligheten.

Relaterade artiklar