从 rescript 中的变体类型访问密钥

Accessing key from variant type in rescript

我对重新编写脚本并试图了解事情的运作方式还很陌生。在我的情况下,我想从这样的变体类型访问密钥。

type personType = Person({name: string, age: int})
let person = Person({
  name: "Jane",
  age: 35,
}) 
Js.log(person.name) // -> Error: The record field name can't be found.

以下使用记录的方法有效:

type personRecord = {
  name: string,
  age: int,
}
let personAsRecord = {name: "Bob", age: 30}
Js.log(personAsRecord.name)

另一种选择是使用模式匹配,这也有效:

let personName = switch person {
| Person({name}) => name
}
Js.log(personName)

所以我的问题是:这是因为类型是一个变体,并且键入不是与打字稿不同的结构类型吗?访问变体键的唯一方法是使用模式匹配吗?

Is the only way to access a variant keys is to use pattern matching ?

是的。

尽管您也可以 deconstruct/pattern 在 let 绑定中匹配:

let Person({name}) = person

和函数参数:

let print = (Person({name})) => Js.log(name)

is this because the type is a variant and the typing is not structural type unlike typescript ?

我真的不明白结构类型与它有什么关系。一个变体可以有并且通常有多个具有不同有效负载的“案例”,如果您不知道它们实际存在,您就无法安全地访问它们的属性。因此,您必须进行模式匹配以确定它是哪种情况,然后然后您可以访问其属性。