ffi – 如何使用reason-react定义在函数签名中接受多个类型的绑
发布时间:2020-12-15 16:18:41 所属栏目:百科 来源:网络整理
导读:定义理由反应绑定时,我想知道如何确定接受多种类型的绑定.例如,我有一个应该接受的参数?值:字符串,数字,数组(字符串)或数组(数字).目前我正在使用选项(‘a),但我不认为这是最干净的方法,因为我更愿意明确定义类型.如何才能做到这一点?我看过bs.unwrap,但我
定义理由反应绑定时,我想知道如何确定接受多种类型的绑定.例如,我有一个应该接受的参数?值:字符串,数字,数组(字符串)或数组(数字).目前我正在使用选项(‘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映射到数字? 解决方法
这可以通过使用以下(灵感来自
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)=?,~props= Js.Nullable.( { ... "value": from_opt(optionMap(unwrapValue,value)),children ); }; 这可以通过以下方式使用; <Select value=(`IntArray([|10,20|])) /> <Select value=(`Int(10)) /> 我从reason-react-toolbox复制到了JSUnsafe,所以我不完全确定它的作用,当我发现时我会更新我的答案. unwrapValue函数接受一个值,该值可以是列出的类型之一,并将其??转换为jsUnsafe. unwrapValue的类型允许列出的任何变体,但也允许其中的一部分,例如. (这是<在启用此功能的变体之前). let option = (value: option([ | `String(string) | `Int(int)])) => Js.Nullable.from_opt(option_map(unwrapValue,value)); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容