Javascript ReasonML访问JS记录字段

Javascript ReasonML访问JS记录字段,javascript,ocaml,reason,bucklescript,Javascript,Ocaml,Reason,Bucklescript,假设我有一个名为Example的全局对象,它有一个构造函数,newexample()返回一个带有键的对象,键名为“Messaging” 假设我有以下原因/Bucklescript代码: [@bs.deriving abstract] type example = { [@bs.as "Messaging"] messaging: string }; type wrappedExample = Js.t(example); [@bs.new] external exampleConstru

假设我有一个名为
Example
的全局对象,它有一个构造函数,
newexample()
返回一个带有键的对象,键名为
“Messaging”

假设我有以下原因/Bucklescript代码:

[@bs.deriving abstract] type example = {
  [@bs.as "Messaging"] messaging: string
};

type wrappedExample = Js.t(example);

[@bs.new] external exampleConstructor: unit => wrappedExample = "ExampleThing";

exampleConstructor()#messaging;
这导致:

This expression has type wrappedExample
It has no method messaging
将最后一行更改为:

exampleConstructor()##消息传递
exampleConstructor()。消息传递
同样失败。这里的问题是什么?如何访问我的javascript值


您似乎将一系列相似的东西混为一谈,但实际上它们并不在一起

因此,首先,
#
用于访问OCaml对象的字段
##
用于访问
Js.t
对象的字段,这里没有这个字段(稍后我将解释原因)

[@bs.deriving abstract]
Js.t
是一个不同的概念,它不会创建任何类型的对象类型,而是生成一个抽象类型(这就是
bs.deriving
注释中的
abstract
)。抽象类型本身没有“结构”,因此不能直接使用它。在
Js.t
中包装它并不会使它成为一个Js对象类型,只是在
Js.t
中包装的一个抽象类型(a
Js.t
对象类型特别是在
Js.t
中包装的一个OCaml对象类型)

关键在于,
[@bs.deriving abstract]
不仅创建了一个抽象类型,还创建了许多对其进行操作的函数。对于每个字段,它都会创建一个后缀为
Get
messagingGet
的getter,如果是可变的,则会创建一个后缀为
Set
的setter。还有一个以类型命名的创建函数,其中字段作为标记参数,因此在本例中,您可以使用
example(~messaging=“whatever”)
创建一个对象。有关详细信息,请参阅

下面是您的示例的固定版本:

[@bs.deriving abstract] type example = {
  [@bs.as "Messaging"] messaging: string
};

[@bs.new] external exampleConstructor: unit => example = "ExampleThing";

exampleConstructor() |> messagingGet;
如果你认为这一切都很混乱,那是因为它是。我已经不知道他们在干什么了,但对我来说也很混乱。我建议完全跳过
[@bs.deriving abstract]
,而是使用普通的
外部
创建抽象类型和访问器。用这种方式来命名事物,就不会有那么多令人困惑的魔法和可怕的命名了