Конфликт имен аксессоров при попытке создать привязку - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь создать привязку для существующей библиотеки 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 голосов
/ 07 января 2019

Вам нужно указать пространство имён. В 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.

...