2017-06-21 3 views
0

Warum fließt fließen Fehler hier?Typ mit Vielleicht Requisiten erlaubt nicht Typ mit Non-Maybe Requisiten

type MaybeProp = { 
    prop: ?number, 
} 

type DefinetlyProp = { 
    prop: number, 
} 


const requireMaybe = (u: MaybeProp) => console.log(u) 
const requireDefinetly = (u: DefinetlyProp) => requireMaybe(u) 

https://flow.org/try/#0FDAuE8AcFMAIFkCG4BG0AKAnA9pWBeWAb2Flkh0gC5YB+AOwFcBbNTAGmAF8QIZYAItABmAS3rRQAG3BZcBYqXKUaTVtA7cQwAMbZ6AZ1CxM0AI6NRppKjiEAFIxo20cyAEoCAPlh7D2KWgAOilsAHNHd119IxNzS1MhMQlpcAVHGiTxSRk3T3wfUwsraBdoSKA

Es scheint so, dass eine Funktion, die Eigenschaften vielleicht umgehen kann, sollte auch in der Lage sein, die gleichen Eigenschaften zu handhaben, wenn sie definitiv festgelegt sind.

Jeder Weg, um dies zu umgehen?

+0

sie die gleiche Art und nutzen Sie den Parameter auf einen „vielleicht“ ... https://flow.org/try/#0FDAuE8AcFMAIAUBOB7SsC8sDexa0ipAFywB2ArgLYBG0iANMAL4jADGypAzqLItAEdyAS34BZAIbhaGWAApyJAPxJUASgwA ändern + WB27IANtAB0 + 5AHMFa9px59BI-gBFoAM2GloofeFkKSqyA10bX4hUWhJaWhLIA – evolutionxbox

+0

Ich rufe dich nicht dumm ... Der Fehler ist aufgetreten, weil du eine Art 'MaybeProp' angefordert hast und eine' DefinitiveProp' übergeben hast ... in deinem zweiten Beispiel, das du anforderst und passierst eine Zahl. – evolutionxbox

+0

@evolutionxbox Das ist offensichtlich. Aber warum bricht es, wenn die Nummer verschachtelt ist? Da flow keinen nominalen Vergleich für Objekte durchführt, schaut es nicht blindlings nach 'MaybeProp! == DefinitivProp'. Es vergleicht die Struktur. – MoeSattler

Antwort

2

Dies liegt daran, dass Objekte in JS veränderbar sind. Soweit das Typsystem betroffen ist, könnte requireMaybeu.prop = null ausführen. Dann würde der ursprüngliche Anrufer erwarten, dass prop ein number sein würde, aber es wäre tatsächlich null. Dies würde die Typensicherheit brechen.

Sie erreichen können, was wollen Sie von property variance mit:

type MaybeProp = { 
    +prop: ?number, 
} 

type DefinetlyProp = { 
    +prop: number, 
} 


const requireMaybe = (u: MaybeProp) => console.log(u) 
const requireDefinetly = (u: DefinetlyProp) => requireMaybe(u) 
+0

Benötigte nur die Eigenschaftsvarianz in MaybeType. Vielen Dank! – MoeSattler