尝试创建绑定的访问者名称冲突

时间:2019-01-07 17:30:07

标签: ffi reason bucklescript

我正在尝试为现有的javascript库创建绑定,但是在尝试使用属性访问功能时遇到错误。

[@bs.deriving abstract]
type objA = {
  prop1: string,
  prop2: string,
  prop3: string,
};

[@bs.deriving abstract]
type objB = {
  prop2: string,
  prop4: string,
};

[@bs.module "myLib"] external getObjA: (unit) => objA = "";
[@bs.module "myLib"] external getObjB: (unit) => objB = "";

let obj = getObjA();
prop2Get(obj) |> Js.log
// ------^^^
// Error: This expression has type objA but an expression was expected of type objB

我知道两个对象都具有相同的属性名称,因此所生成的函数prop2Get(...)被覆盖。这种情况下有什么解决方案?

1 个答案:

答案 0 :(得分:4)

您需要为它们命名空间。在OCaml / Reason中,命名空间的方法是将它们放在单独的模块中。具体来说,

module ObjA = {
  [@bs.deriving abstract] type t = {
    prop1: string,
    prop2: string,
    prop3: string,
  };

  [@bs.module "myLib"] external get: (unit) => t = "getObjA";
};

module ObjB = {
  [@bs.deriving abstract] type t = {
    prop2: string,
    prop4: string,
  };

  [@bs.module "myLib"] external get: (unit) => t = "getObjB";
};

现在,访问器还通过其类型的模块来命名空间:

() |> ObjA.get |> ObjA.prop2Get |> Js.log;

令人高兴的是,由于模块名称被用作整体名称的一部分,因此您无需在名称中重复任何内容,例如getObjAgetObjB