-
Notifications
You must be signed in to change notification settings - Fork 24.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Refine StyleSheet Flow types #16741
Refine StyleSheet Flow types #16741
Conversation
LGTM! |
Libraries/StyleSheet/StyleSheet.js
Outdated
@@ -20,8 +20,8 @@ const flatten = require('flattenStyle'); | |||
|
|||
export type Styles = {[key: string]: Object}; | |||
export type StyleSheet<S: Styles> = {[key: $Keys<S>]: number}; | |||
export type StyleValue = {[key: string]: Object} | number | false | null; | |||
export type StyleProp = StyleValue | Array<StyleValue>; | |||
export type StyleValue = Object | number | false | null | void; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
According to flattenStyle
any "falsy" value works so the users could do thing && styles.blah
. I'm not sure if Flow has a special type representing falsy values, but might be a good idea to also include ''
(empty string) here
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good spot, thanks. I don't know of any special falsey type in Flow, so have just gone with empty string.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@TheSavior has imported this pull request. If you are a Facebook employee, you can view this diff on Phabricator.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@TheSavior has imported this pull request. If you are a Facebook employee, you can view this diff on Phabricator.
Thanks for contributing! |
Summary: Nice addition of the recent Flow types for style props in 9c29ee1, however I think there are some slight issues in the definition. `type Styles = {[key: string]: Object}` makes sense, as it's referring to the set of named style groups a user creates a `StyleSheet` from, e.g. ```javascript const styles: StyleSheet = StyleSheet.create({ container: { height: 20 }, text: { color: 'facebook#999', fontSize: 12, }, }: Styles) ``` However `type StyleValue = {[key: string]: Object}` doesn't make sense. You actually want only the `Object` portion of that definition, presuming it's meant to be used like below: ```javascript type MyTextProps = { style: StyleProp, } <MyText style={{ color: 'facebook#999', fontSize: 12 }}>Hello</Text> ``` --- I've also added `void` to the `StyleValue`, as undefined seems to be handled fine, and can be a useful shorthand in JSX. --- And finally, I've allowed nesting of style prop arrays, by making StyleProp self-referencing, as RN seems to flatten those without issue. This can be important if you're passing in a style prop quite high up the component tree, and sticking it in an array with other styles at several points while it's passed down. N/A (These types aren't referenced anywhere else) [INTERNAL] [MINOR] [StyleSheet] - Refine Flow types Closes facebook#16741 Reviewed By: frantic Differential Revision: D6278010 Pulled By: TheSavior fbshipit-source-id: 0170a233ab71d29f445786f5e695463f9730db3a
Nice addition of the recent Flow types for style props in 9c29ee1, however I think there are some slight issues in the definition.
type Styles = {[key: string]: Object}
makes sense, as it's referring to the set of named style groups a user creates aStyleSheet
from, e.g.However
type StyleValue = {[key: string]: Object}
doesn't make sense. You actually want only theObject
portion of that definition, presuming it's meant to be used like below:I've also added
void
to theStyleValue
, as undefined seems to be handled fine, and can be a useful shorthand in JSX.And finally, I've allowed nesting of style prop arrays, by making StyleProp self-referencing, as RN seems to flatten those without issue. This can be important if you're passing in a style prop quite high up the component tree, and sticking it in an array with other styles at several points while it's passed down.
Test Plan
N/A (These types aren't referenced anywhere else)
Release Notes
[INTERNAL] [MINOR] [StyleSheet] - Refine Flow types