gpt4 book ai didi

ffi - 如何使用reason-react定义一个在函数签名中接受多种类型的绑定(bind)?

转载 作者:行者123 更新时间:2023-12-04 19:16:10 27 4
gpt4 key购买 nike

在定义一个原因 react 绑定(bind)时,我想知道如何确定一个接受多种类型的绑定(bind)。例如,我有一个参数 ~value应该接受:string , number , array(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
);
};

作为一个附带问题,由于未定义数字类型,我的绑定(bind)是否也必须将浮点数和整数映射为数字?

最佳答案

这可以通过使用以下内容(受 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。
unwrapValue 的类型例如,允许列出任何变体,但也允许其中的一个子集。 (它是启用此功能的变体之前的 <)。

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

关于ffi - 如何使用reason-react定义一个在函数签名中接受多种类型的绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47179363/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com