首页 > 解决方案 > Bs.deriving Abstract getter 函数在使用大写名称时返回 undefined

问题描述

在 bs.deriving abstract 的 bucklescript 文档示例中,您可以使用nameGet()

这有效:

@bs.deriving abstract]
type person = {
  name: string,
  age: int,
  job: string,
};
let joe = person(~name="Joe", ~age=20, ~job="teacher");
let name = nameGet(joe);

如果您将其更改为大写 name 键,如下所示,您生成的 getter 将变为_NameGet()

type person = {
  _Name: string,
  age: int,
  job: string,
};
let joe = person(~_Name="Joe", ~age=20, ~job="teacher");
let name = _NameGet(joe);

在第二个示例中,名称值返回未定义。这怎么能解决?repl 中的示例:tryreason

标签: ocamlreasonbucklescript

解决方案


使用 [bs.as] 为密钥的名称命名。这显然不会更改在这种情况下仍将保留_NameGet但值不再返回未定义的 getter 的名称。

[@bs.deriving abstract]
type person2 = {
  [@bs.as "Name"]
  _Name: string,
  age: int,
  job: string,
};

let john = person2(~_Name="John", ~age=20, ~job="teacher")
let namejohn = _NameGet(john);
Js.log(namejohn);

输出:John

文档:重命名字段


推荐阅读