代码之家  ›  专栏  ›  技术社区  ›  Abraham P

ReasonML access JS记录字段

  •  2
  • Abraham P  · 技术社区  · 6 年前

    假设我有一个叫做 Example ,它的构造函数 new Example() "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()##messaging exampleConstructor().messaging 同样的失败。这里有什么问题?如何访问我的javascript值?

    https://reasonml.github.io/en/try?rrjsx=true&reason=NoAQRgzgdAJgpgJwJYDckDsDmACAhpAFwVwGMCBdbAgTwAc5s4APXAW1oBsGBebAbwBQ2bKEhRcEbACIAsnAgRcmDJimVW8xcqwAubBCIqBAXwDcAgTXrYA7sVr0YAURbsu2XgCloBABTM2TjgASnMBUWh0OBtKZgJEdFwORlcggGEAe3QDBABXMgyEPVz0JAIPAD5be0cXQPdeKTq3OAAVAAsVKTCAlszsonyCQt9ggGINBSUVUyA

    1 回复  |  直到 6 年前
        1
  •  4
  •   glennsl Namudon'tdie    6 年前

    你似乎把一堆相似的东西混为一谈,但实际上并不在一起。

    所以首先, # 用于访问OCaml对象的字段。 ## Js.t 对象,这不是你在这里(我会解释为什么在一分钟内)。

    [@bs.deriving abstract] Js.t公司 不会创建任何类型的对象类型,但会生成 抽象类型 (这是什么 abstract bs.deriving 注释提示位于)。抽象类型本身没有“结构”,因此不能直接使用它。把它包起来 不使它成为JS对象类型,只是一个封装在中的抽象类型 (一) Js.t公司 Js.t公司 ).

    关键是 不只是创建一个抽象类型,还有许多对其进行操作的函数。它为每个字段创建一个后缀为 Get , messagingGet 在你的情况下,如果可变的话 Set . 还有一个以类型命名的创建函数,并将字段作为标记参数,因此在您的示例中,可以使用 example(~messaging="whatever") the BuckleScript documentation 详情。

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

    [@bs.deriving abstract] type example = {
      [@bs.as "Messaging"] messaging: string
    };
    
    [@bs.new] external exampleConstructor: unit => example = "ExampleThing";
    
    exampleConstructor() |> messagingGet;
    

    [@bs.deriving摘要] external s。用这种方式来命名事物,就不那么令人费解了。