reason-react
reason-react copied to clipboard
Local abstract (and polymorphic) types and [@react.component]
There seems to be no way to use local abstract types when using [@react.component]:
Defining a polymorphic local abstract type like this:
[@react.component]
let make: type a. (~value: Value.t(a)) => React.element =
(~value: Value.t(_)) => {
<input
value={
switch (value) {
| Input.String(value) => value
| Input.Int(value) => string_of_int(value)
| _ => ""
}
}
/>;
};
Raises a Fatal error: exception Invalid_argument("react.component calls cannot be destructured.")
.
And defining a simple local abstract type:
[@react.component]
let make = (type a, ~value: Value.t(_)) => {
<input
value={
switch (value) {
| Value.String(value) => value
| Value.Int(value) => string_of_int(value)
| _ => ""
}
}
/>;
};
Raises a Fatal error: exception Invalid_argument("react.component calls can only be on function definitions or component wrappers (forwardRef, memo).")
.
Is there any way to achieve this?
@jchavarri pointed me in the direction of writing the make
and makeProps
functions by hand instead of using [@react.component]
, which worked for what I needed. It would definitely be nice for the PPX to allow annotations, though.
Here's an example of what I ended up doing, in case it helps anyone else: https://github.com/mlms13/csv-reader/blob/8bc543284769bb3308aef80ac2434c575537aca4/src/components/FileInput.re#L46-L57
I’m just wondering whats a difference between type a. props(a) and props(‘a). I’ve never seen the first version of syntax. Is there any piece of documentation about it?
@baransu https://caml.inria.fr/pub/docs/manual-ocaml/manual027.html
Thanks!