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

问题描述

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

空间极其有限,因此我不想添加执行相同操作的 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";