2

我正在尝试执行以下操作:

let str_result: Js.Nullable.t(string) = Js.Nullable.return("something");
let int_result: Js.Nullable.t(int) = Js.Nullable.fromOption(Some(5));
Js.log([|str_result, int_result|]);

但是,当然,我收到以下投诉:

Error: This expression has type Js.Nullable.t(int) = Js.nullable(int)
       but an expression was expected of type
         Js.Nullable.t(string) = Js.nullable(string)
       Type int is not compatible with type string

所以我使用string_of_int

Js.log([|str_result, string_of_int|]);

但后来我遇到了以下问题:

This has type:
  Js.Nullable.t(int) (defined as Js.nullable(int))
But somewhere wanted:
  int

是使用 a 的正确方法switch还是有其他方法可以做到这一点?

4

2 回答 2

4

Js.Nullable.t您可以使用以下方法更改 a 的“内部”类型Js.Nullable.bind

let str_of_int_result: Js.Nullable.t(string) =
  Js.Nullable.bind(int_result, (. n) => string_iof_int(n));

或者,您可以将 aJs.Nullable.t转换为option, 对其进行模式匹配,然后可以选择将其Js.Nullable.t再次包装在 a 中:

let str_of_int_result: Js.Nullable.t(string) =
  switch (Js.Nullable.toOption(int_result)) {
  | Some(n) => Js.Nullable.return(string_of_int(n)))
  | None    => Js.Nullable.null
  };

为了比较,这些是等价的。如果你想保留它Js.Nullable.t,你通常会使用第一种方法,如果你不想使用第二种方法。

于 2018-03-28T08:48:34.177 回答
0

When using a ReasonReact Ref to access a DOM node, I'm using the following to access the DOM node as an object (aka Js.t<'a>).

let nodeRef = React.useRef(Js.Nullable.null)

...

switch Js.Nullable.toOption(nodeRef.current) {
| None => ()
| Some(node) => {
    let node = ReactDOMRe.domElementToObj(node)
    node["scrollTop"] = node["scrollHeight"]
  }
}

...

<main ref={ReactDOM.Ref.domRef(nodeRef)}>
于 2020-11-07T04:32:45.200 回答