reason-react icon indicating copy to clipboard operation
reason-react copied to clipboard

Local abstract (and polymorphic) types and [@react.component]

Open gaku-sei opened this issue 5 years ago • 4 comments

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?

gaku-sei avatar Aug 16 '19 08:08 gaku-sei

@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

mlms13 avatar Sep 18 '19 14:09 mlms13

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 avatar Sep 22 '19 08:09 baransu

@baransu https://caml.inria.fr/pub/docs/manual-ocaml/manual027.html

anmonteiro avatar Sep 22 '19 16:09 anmonteiro

Thanks!

baransu avatar Sep 22 '19 18:09 baransu