如何使用原因反应定义在函数签名中接受多种类型的绑定?

用户465374

在定义原因反应绑定时,我想知道如何确定可以接受多种类型的绑定。例如,我有一个说法~value认为应该接受:stringnumberarray(string)array(number)目前,我正在使用,option('a)但我认为这不是最干净的方法,因为我希望明确定义类型。如何才能做到这一点?我已经看过了,bs.unwrap但不确定如何将外部语法组合到函数签名中。

module Select = {
  [@bs.module "material-ui/Select"] external reactClass : ReasonReact.reactClass = "default";
  let make =
      (
        ...
        ~menuProps: option(Js.t({..}))=?,
        ~value: option('a), /* Should be type to string, number, Array of string and Array of number */
        ~style: option(ReactDOMRe.style)=?,
        ...
        children
      ) =>
    ReasonReact.wrapJsForReason(
      ~reactClass,
      ~props=
        Js.Nullable.(
          {
            ...
            "value": from_opt(value),
            "style": from_opt(style)            
          }
        ),
      children
    );
};

附带的问题是,由于未正确定义数字类型,因此我的绑定还必须将float和integer映射为数字吗?

InsidersByte

这可以通过使用以下内容(受https://github.com/astrada/reason-react-toolbox/启发)来实现。

type jsUnsafe;

external toJsUnsafe : 'a => jsUnsafe = "%identity";

let unwrapValue =
    (r: [< | `Int(int) | `IntArray(array(int)) | `String(string) | `StringArray(array(string))]) =>
  switch r {
  | `String(s) => toJsUnsafe(s)
  | `Int(i) => toJsUnsafe(i)
  | `StringArray(a) => toJsUnsafe(a)
  | `IntArray(a) => toJsUnsafe(a)
  };

let optionMap = (fn, option) =>
  switch option {
  | Some(value) => Some(fn(value))
  | None => None
  };

module Select = {
  [@bs.module "material-ui/Select"] external reactClass : ReasonReact.reactClass = "default";
  let make =
      (
        ...
        ~menuProps: option(Js.t({..}))=?,
        ~value:
          option(
            [ | `Int(int) | `IntArray(array(int)) | `String(string) | `StringArray(array(string))]
           )=?,
        ~style: option(ReactDOMRe.style)=?,
        ...
        children
      ) =>
    ReasonReact.wrapJsForReason(
      ~reactClass,
      ~props=
        Js.Nullable.(
          {
            ...
            "value": from_opt(optionMap(unwrapValue, value)),
            "style": from_opt(style)            
          }
        ),
      children
    );
};

可以按以下方式使用:

<Select value=(`IntArray([|10, 20|])) />
<Select value=(`Int(10)) />

我是toJsUnsafe从reason-react-toolbox复制的,所以我不完全确定它是做什么的,当我发现时会更新我的答案。

unwrapValue函数采用的值可以是列出的类型之一,并将其​​转换为jsUnsafe。

例如,unwrapValuefor的类型允许列出的任何变体,但也允许这些变体的子集。(这<是启用此功能的变体之前的版本)。

let option = (value: option([ | `String(string) | `Int(int)])) =>
  Js.Nullable.from_opt(option_map(unwrapValue, value));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在函数中接受多种类型作为参数?

您如何使一个函数接受多种类型?

如何在Golang中为多种类型编写函数?

一个接受多种类型的函数

在Nim中定义多种类型的参数

如何使用mgo在单个集合中处理多种类型

反应如何集成多种类型的搜索功能

如何使用CONCATENATEX或类似函数在POWER BI中获得具有多种类型的唯一ID

在Julia中为多种类型的输入定义一个函数

如何将变量绑定为多种类型?LINQ

接受多种类型的方法参数

使go变量接受多种类型

如何在同一个组件中定义多种类型的导航容器?

如何在Golang中编写一个以多种类型为参数的函数?

如何编写采用go中多种类型之一的函数?

如何将具有多种类型的参数作为参数传递给 Typescript 中的函数?

如何在打字稿中使用多种类型的数组调用map函数

在TypeScript中定义具有多种类型的数组

如何使用类型提示为参数指定多种类型?

Haskell 中的“多种类型”

如何使用一种类型以相同的结构键入函数签名和数组

如何定义在Go中接受任意数量参数的函数类型?

如何在 Laravel 中为多种类型的管理员使用中间件?

允许函数接受 Haskell 中的各种类型

在函数中接受不止一种类型的枚举

在Haskell中,如何重新排序多种类型

如何在Firebase中推送多种类型的数据?

如何使用RTypeProvider创建多种类型的数据框

如何使用picocli处理多种类型的期权