typescript - Type Vernauwing van een element in een array met `find`
Als ik een array heb gevuld met items van een unietype en ik wil een element binnen de array vinden en ermee werken, wetende dat ik door mijn find het type heb beperkt, hoe bereik ik dit?
Dat wil zeggen, als ik de volgende types heb:
interface A {
text: string;
}
interface B {
type: string;
}
type C = A|B;
en de volgende code
const arr: Array<C> = [....]
Ik wil het eerste element van arr vinden dat een type-attribuut heeft.
Logisch gezien denk ik dat dit wordt weergegeven door
const output = arr.find(child => {
if ('type' in child) return true;
return false
})
Het lijkt erop dat dit het type van output zou moeten beperken tot B, maar dat is niet het geval. De compiler lijkt nog steeds te denken dat output van het type C is.
Antwoord #1
De typeveilige manier om de typeguard in jouw geval te implementeren is
function isB(c: C): c is B {
if ('type' in c) {
return typeof c.type === 'string';
}
return false;
}
Het andere antwoord houdt geen rekening met het feit dat er geldige C-waarden zijn die een type-eigenschap hebben die geen tekenreeks is.
Antwoord #2
gebruik een typebewaker:
function isB(c: C) c is B {
return typeof (c as B).type === 'string';
}
const output = arr.find(isB);
De typeguard vertelt TypeScript wat er aan de hand is, zodat het het type kan afleiden.
bewerkt om te controleren of het type van type string is, aangezien dat blijkbaar mogelijk is
