typescript - Hur man kontrollerar om ett objekt är av en av unionstyperna
Jag har 2 gränssnitt: TypeA och TypeB.
Mitt React-skript tar emot ett objekt Object som har typen TypeA|TypeB.
Jag har en funktion doSomething(attribute:TypeA) Jag vill skicka ett Object som ett attribut på detta sätt doSomething(Object), men TS säger
Typen 'TypeA | TypeB' kan inte tilldelas typen 'TypeA'. Typen 'TypeB' saknar följande egenskaper från typen 'TypeA': prop1, prop2, prop3.
Kanske kan jag sätta en ny temporär variabel bara om den är av typen TypeA och sedan skicka den till funktionen?
const tempVar:Type1 = Object
Jag har provat detta
const tempVar:Type1 = Object instanceof Type` ? Object : undefined ;
men jag får detta fel utöver det ovan
'Type1' refererar endast till en typ, men används här som ett värde.
Finns det en lösning för situationen, eftersom jag inte kan ändra funktionen doSomething() för att acceptera båda typerna?
Svar #1
En möjlig lösning tillsammans med Nicholas Tower-svaret är att använda in-nyckelordet.
Kopierad från dokumenten.
function move(pet: Fish | Bird) {
if ("swim" in pet) {
return pet.swim();
}
return pet.fly();
}
Svar #2
Du kan skapa en egen typvakt och använda den för att begränsa typen. Om funktionen returnerar sant vet TypeScript att objektet är av den angivna typen. Till exempel:
const isTypeA = (obj: TypeA | TypeB): obj is TypeA => {
return obj.prop1 === 'value1';
}
// elsewhere:
function somefunction(obj: TypeA | TypeB) {
if (isTypeA(obj)) {
// Inside this block typescript knows that obj is a TypeA, and can't be a TypeB
doSomething(obj);
}
}
