reasonml / reason-react

Reason bindings for ReactJS
https://reasonml.github.io/reason-react/
MIT License
3.25k stars 348 forks source link

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

Open gaku-sei opened 5 years ago

gaku-sei commented 5 years ago

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?

mlms13 commented 5 years ago

@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

baransu commented 5 years ago

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?

anmonteiro commented 5 years ago

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

baransu commented 5 years ago

Thanks!