Как написать разумную привязку для типа объединения - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь написать привязки для https://github.com/oblador/react-native-keychain/blob/master/typings/react-native-keychain.d.ts#L76

getGenericPassword возвращает false в случае ошибки, иначе object (credentials).Я не уверен, что этот тип объединения может быть представлен в разумных пределах, но лучшим API был бы результат опция (опция (учетные данные)).Но как я могу преобразовать Promise<boolean | credentials> -> Js.Promise.t(option(credentials)) в файл привязки.Ниже приведен шаблон.

Спасибо за помощь.

[@bs.deriving abstract]
type credentials = {
  service: string,
  username: string,
  password: string,
};

/* TODO convert the actual return value 
Js.Promise.t(option(credentials)) to more reason type 
Js.Promise.t(option(credentials)) */

[@bs.module "react-native-keychain"] [@bs.scope "default"]
external getGenericPassword: unit => Js.Promise.t(option(credentials)) = "";

1 Ответ

0 голосов
/ 12 сентября 2018

Вы можете использовать Js.Types.classify, чтобы получить тип времени выполнения значения.

type maybeCredentials;

[@bs.module "react-native-keychain"] [@bs.scope "default"]
external getGenericPassword: unit => Js.Promise.t(maybeCredentials) = "";

let getGenericPassword: unit => Js.Promise.t(option(credentials)) =
  () =>
    Js.Promise.(
      getGenericPassword()
      |> then_(maybeCredentials =>
           switch (Js.Types.classify(maybeCredentials)) {
           | JSObject(obj) => resolve(Some(obj |> Obj.magic))
           | _ => resolve(None)
           }
         )
    );

Здесь maybeCredentials определяется и используется как промежуточный тип.

Затем мы определяем функцию с тем же именем, что и привязка, которая будет «скрывать» имя и предотвращать непосредственное использование привязки в пользу нашего «переопределения». Тем не менее, в переопределении мы все еще можем использовать привязку.

Затем мы вызываем Js.Types.classify, чтобы получить тип времени выполнения возвращаемого значения. Если это объект, мы используем Obj.magic для приведения абстрактного obj_type к нашему типу credentials (выведенному из возвращаемого типа функции) и заключаем его в option. Для любого другого типа мы возвращаем None.

Кстати, этот тип "типа" называется непомеченным союзом. Я записал несколько примеров использования различных стратегий для их решения как производителя, так и потребителя в bucklescript-cookbook .

...