2017-06-19 4 views
1

-Code hereFlow - Kreuzung mit Überwurftypen Fehler: „Eigentum nicht auf jedem Mitglied des Kreuzungstypen zugegriffen werden kann“

versucht wird, kann ich einen Typen, der eine Kreuzung von Union-Typ ist:

type Location = { 
    latitude: number, 
    longitude: number 
} & ({ 
    locationType: 'country', 
    country: string 
} | { 
    locationType: 'state', 
    state:string 
}) 

ich eine andere Funktion haben, die etwas auf einer der Union-Typen nicht zugrunde gelegt:

const getLocationValue = (location: Location): string => { 
    if (location.locationType === 'country') 
    return location.country 
    else 
    return location.state 
} 

jedoch gibt dies mir den Fehler:

property country . Property cannot be accessed on any member of intersection type

^Eigenschaft state. Auf die Eigenschaft kann auf keinem Mitglied des Schnittstellentyps zugegriffen werden

Flow sollte verstehen können, dass, wenn locationType ein Land ist, eine Ländereigenschaft vorhanden sein sollte.

Was mache ich falsch?

Antwort

2

Um eine disjoint union Flow verwenden müssen 2 + Typen zwischen denen zu wählen. Derzeit haben Sie nur einen einzigen Typ definiert: Location. Sie können die gemeinsamen Werte in eine Art "abstrakten" Typ aufteilen und Location eine echte Union Typ machen, um Flow zu ermöglichen, zwischen ihnen zu wählen. Es könnte wie folgt aussehen:

type AbstractLocation = { 
    latitude: number, 
    longitude: number, 
} 

type CountryLocation = AbstractLocation & { 
    country: string, 
    locationType: 'country', 
} 

type StateLocation = AbstractLocation & { 
    locationType: 'state', 
    state: string, 
} 

type Location = CountryLocation | StateLocation 

Versuchen Sie es: working example auf flow.org

Verwandte Themen