如何从 Reason 中输入 JS 模块方法?

How can I type a JS module method from Reason?

为了将现有的基于 JS 的 WebUI 重构为 ReasonML,我尝试嵌入一些重构代码。目前,我通过将所有 ReasonML 代码(到目前为止)嵌入到 iframe.

中来做到这一点

Space 非常有限,所以我不想添加一个做同样事情的 reasonml 模块,而是想在我的 ReasonML 代码中使用其中一种 JS 方法,但我不清楚键入调用的语法。在 JS 中,调用很简单:

toastr.success("You're awesome");

似乎没有 toastr 对象的显式构造函数,但无论如何我都尝试这样做:

type bread;
[@bs.new]  external toastr: unit => bread = "toastr";
[@bs.send] external success: bread => string = "success"; 

及后面的代码:

let bread = toastr();
bread->success("Would be surprised if this worked.");

以上代码无法编译,在 bread->success("") 行失败并显示消息:

This expression has type string
It is not a function.

如何使这项工作(在 bs 8.4.2 中)?


编辑 #2

我已经更接近我希望使用的 JS 输出:

[@bs.scope "toastr"][@bs.val] external success: string => unit = "success";

我可以调用:

success("It worked?");

生成 JS:

toastr.success("It worked?");

但它在 运行 时抛出异常,因为它找不到 toastr 模块。

我想我现在遇到了不同的问题?

我相信你可以使用@module 实现你的目标:

@module("toastr") external success: string => unit = "success";

可在此处找到相关文档:https://rescript-lang.org/docs/manual/latest/import-from-export-to-js#import-a-javascript-modules-named-export

最后,我是这样做的:

[@bs.scope "toastr"][@bs.val] external t_success:   string => unit = "success";