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
中包装的一个抽象类型(aJs.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]
,而是使用普通的外部
创建抽象类型和访问器。用这种方式来命名事物,就不会有那么多令人困惑的魔法和可怕的命名了