gpt4 book ai didi

ocaml - 如何为联合类型编写 reasonml 绑定(bind)

转载 作者:行者123 更新时间:2023-12-04 23:12:43 26 4
gpt4 key购买 nike

我正在尝试为 https://github.com/oblador/react-native-keychain/blob/master/typings/react-native-keychain.d.ts#L76 编写绑定(bind)

getGenericPassword 返回 false如果出错,则返回 object (credentials)。我不确定这种联合类型是否可以合理地表示,但更好的 API 将是一个选项(选项(凭据))的结果。但是,如何转换 Promise<boolean | credentials> -> Js.Promise.t(option(credentials))在绑定(bind)文件中。下面是一个模板。

谢谢你的帮助。

[@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)) = "";

最佳答案

您可以使用 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被定义并用作中间类型。

然后我们定义一个与绑定(bind)同名的函数,这将“隐藏”该名称并防止直接使用绑定(bind)以支持我们的“覆盖”。但是,在覆盖范围内,我们仍然可以使用绑定(bind)。

然后我们调用 Js.Types.classify获取返回值的运行时类型。如果它是一个对象,我们使用 Obj.magic投出摘要 obj_type到我们的 credentials类型(从函数的返回类型推断),并将其包装在 option 中.对于任何其他类型,我们返回 None .

顺便说一下,这种“类型”被称为无标签联合。作为生产者和消费者,我在 bucklescript-cookbook 中写下了一些使用不同策略来处理这些问题的示例。 .

关于ocaml - 如何为联合类型编写 reasonml 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52297115/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com