Вы можете использовать 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 .