I'm trying to type (with flowtype) the components I'm enhancing with Relay.createContainer.
I looked into the types exported by the "react-relay" package but ReactContainer doesn't seem to carry over Props.
I experimented with RelayContainer, ReactClass, React$Component etc, in the end the closest thing to the expected result I could get is :
// Foo.js // @flow import React from "react"; import Relay from "react-relay"; type Props = { title: string; } const Foo({ title }: Props) => (<div>{title}</div>); const exported: Class<React$Component<void, Props, void>> = Relay.createContainer(Foo, { fragments: { ... } }); export default exported; --
// Bar.js // @flow import React from "react"; import Foo from "./Foo.js"; const Bar = () => <Foo />; Now flow will complain in Foo.js around Props that Bar doesn't provide the title prop, which kinda what I want (I'd like it to complain in Bar.js but it's a detail). However if Bar was also a RelayContainer referencing Foo's fragment flow would complain that it can't find getFragment in Foo's properties:
// Bar.js // @flow import React from "react"; import Relay from "react-relay"; import Foo from "./Foo.js"; const Bar = () => <Foo />; export default Relay.createContainer(Bar, { fragments: { baz: () => Relay.QL` fragment on Baz { ${Foo.getFragment("foo")} } ` } } In the end I'm trying to type the output of Relay.createContainer so that it carries over the typing of the decorated component. I looked into the Relay's internal types and saw https://github.com/facebook/relay/blob/8567b2732d94d75f0eacdce4cc43c3606960a1d9/src/query/RelayFragmentReference.js#L211 but I feel like it's not the way to go to add in Relay's properties.
Any idea how could I achieve this ?
as @gre pointed out, now the Relay Compiler generates Flow types for the fragment and these are exported in generated files within a __generated__ subdirectory.
generating said file by running the Relay Compiler
relay-compiler --src ./src --schema ./schema.json
You would then import the flow types for the field props like so:
import type { MyComponent_myField } from "./__generated__/MyComponent_myField.graphql"; class MyComponent extends Component<{ myField: MyComponent_myField, }> { render() { return <div>Example</div>; } } export default createFragmentContainer(MyComponent, { myField: graphql` fragment MyComponent_myField on MyType { edges { node { _id foo } } } ` }); Although AFAIK currently types for spreaded fragments are not generated unless you use the Haste module system
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With