0

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

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)

所以我的问题是:这是因为类型是变体,而打字不像打字稿那样是结构类型吗?访问变体键以使用模式匹配的唯一方法是什么? 

4

1 回答 1

1

访问变体键的唯一方法是使用模式匹配吗?

是的。

虽然您也可以在let绑定中解构/模式匹配:

let Person({name}) = person

和函数参数:

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

这是因为类型是变体,而打字不像打字稿那样是结构类型吗?

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

于 2021-03-10T16:52:57.130 回答