【问题标题】:Bindings for functions with options parameter带有选项参数的函数的绑定
【发布时间】:2018-02-01 18:30:12
【问题描述】:

JavaScript 中的常见做法是有一个接收选项参数的函数,如下所示:

function foo({ bar1, bar2, bar3 }) {}
foo({ bar1: 5, bar2: 3 })

在 Reason/OCaml 中,人们更愿意为这些函数使用带标签的参数:

let foo = (~bar1, ~bar2, ~bar) => {}
foo(~bar1=5, ~bar2=3, ())

现在,我知道有一种方法可以为以下函数创建 Reason/Bucklescript 绑定:

type barObj;
[@bs.obj] external makeBarObj : (
  ~bar1: int=?,
  ~bar2: int=?,
  ~bar3: int=?,
  unit
) => barObj = "";

external foo : barObj => t = "foo";

foo(makeBarObj(~bar1=5, ~bar2=3, ());

但是,有没有更简单的方法来为这些函数编写绑定?我对这种方法的问题是,当调用一个接受选项对象的函数时,它会变得相当“长”,特别是如果它是一个多态参数,例如:

foo(`BarObj(makebarObj(~bar1=5, ~bar2=3, ())));

【问题讨论】:

    标签: reason bucklescript


    【解决方案1】:

    您可以直接构造对象,而不是使用单独的函数:

    [@bs.val] external foo : Js.t({..}) => t = "";
    let foo = (~bar1=?, ~bar2=?, ~bar3=?, unit) =>
      foo({
        "bar1": Js.Nullable.from_opt(bar1),
        "bar2": Js.Nullable.from_opt(bar2),
        "bar3": Js.Nullable.from_opt(bar3)
      });
    

    只需调用即可

    foo(~bar1=5, ~bar2=3, ());
    

    但请注意,这并不完全等同于 [@bs.obj] 生成的内容,因为 undefined 的属性并不总是被解释为未定义。

    如果您需要将它包装在一个变体中传递,您可以让对象构造函数包装它。您通常也可以定义一组函数:

    fooWithString("bar");
    fooWithOptions(~bar1=5, ~bar2=3, ());
    

    【讨论】:

    • If you need to pass it wrapped in a variant, you could have the object construction function wrap it. 你能澄清一下具体是怎么做的吗?
    • 如果你手动构造对象,你可以在返回之前将其包装起来:let makeBarObj = (~bar1=?, ...) => `BarObj({ "bar1": Js.Nullable.from_opt(bar1), ...});
    【解决方案2】:

    另一个假设似乎是这个:

    [@bs.obj]
    external makeBarObj : (~bar1: string=?, ~bar2: int=?, ~bar3: string=?, unit) => barObj =
      "";
    
    [@bs.val] external foo : barObj => t = "foo";
    
    let foo = (~bar1=?, ~bar2=?, ~bar3=?) => foo(makeBarObj(~bar1?, ~bar2?, ~bar3?, ()));
    

    然后这样API的客户端就可以简单的调用了:

    foo(~bar1=5, ~bar2=3, ())
    

    基本上和问题中给出的解决方案是一样的,只是这把对象转换代码隐藏在库中,让客户不用担心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 2016-02-08
      • 2012-05-06
      • 2021-02-28
      • 2015-11-28
      • 2020-06-30
      • 1970-01-01
      相关资源
      最近更新 更多