试图创建绑定的访问器名称冲突
Accessors name conflict trying to create a binding
我正在尝试为现有的 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(...)
被覆盖了。这种情况的解决方案是什么?
您需要为它们命名空间。在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;
好的是,由于模块名称用作整体名称的一部分,因此您无需在名称中重复内容,例如 getObjA
、getObjB
.
我正在尝试为现有的 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(...)
被覆盖了。这种情况的解决方案是什么?
您需要为它们命名空间。在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;
好的是,由于模块名称用作整体名称的一部分,因此您无需在名称中重复内容,例如 getObjA
、getObjB
.