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.
