2017-01-12 7 views
2

Ich habe den folgenden Code in meinem Reagieren App:Flowtype: bedingt erforderlich Typ

import isRequiredIf from 'react-proptype-conditional-require' 

Auth.propTypes = { 
    children: PropTypes.any, 
    step: PropTypes.number, 
    steps: isRequiredIf(PropTypes.number, props => props.hasOwnProperty('step')), 
    footer: PropTypes.any 
} 

Hier steps ist nur erforderlich, wenn step angegeben ist.

Ich migriere meine React PropTypes zu Flow. Kann ich irgendwie das gleiche Verhalten mit Flow erreichen?

Antwort

3

Dies kann nicht mit Flow in dieser Form durchgeführt werden. Da PropTypes zur Laufzeit und nicht statisch überprüft werden, kann die Flexibilität erhöht werden. Wenn ein statischer Typchecker so etwas erlaubt, wäre es unentscheidbar.

type Props = { 
    children: any, 
    // not sure about this name, but you get the idea 
    step: ?{ 
    step: number, 
    steps: number, 
    }, 
    footer: any, 
} 

Oder, wenn Sie steps aber nicht step haben kann:

aber Sie so etwas tun könnte

type Props = { 
    children: any, 
    // not sure about this name, but you get the idea 
    step: ?{ 
    step?: number, 
    steps: number, 
    }, 
    footer: any, 
} 

Offensichtlich ist keine dieser Optionen ganz so prägnant wie das, was Sie haben und müssen den Code ändern, der diese Werte erzeugt und konsumiert. Leider ist manchmal ein Preis zu zahlen, um die Sicherheit eines statischen Typcheckers zu erhalten.

ist eine weitere Option, nur sie beide optional zu lassen:

type Props = { 
    children: any, 
    step?: number, 
    steps?: number, 
    footer: any, 
} 

Auf diese Weise wird Fluss nicht erzwingen, dass steps liegt vor, wenn step existiert. Sie müssen jedoch Ihren anderen Code nicht ändern, und nichts hindert Sie daran, eine Laufzeitprüfung hinzuzufügen (was nicht schlechter ist als das, was Sie bereits haben).

Verwandte Themen