Как написать разумную привязку для типа объединения
Я пытаюсь написать привязки для 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 ответ
Ты можешь использовать 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
,
Кстати, этот тип "типа" называется не маркированным союзом. Я записал несколько примеров использования различных стратегий для решения этих проблем, как производителя, так и потребителя, в buckscript-cookbook.