密封/协变对象和$ Exact + $ ReadOnly之间有什么区别?

Gaj*_*jus 5 javascript flowtype

之间有什么区别:

type MovieType = {|
  +blob?: string,
  +name: string,
  +url?: string
|};
Run Code Online (Sandbox Code Playgroud)

type MovieType = $Exact<$ReadOnly<{
  blob?: string,
  name: string,
  url?: string
}>>;
Run Code Online (Sandbox Code Playgroud)

我想知道是否根据它们的定义方式不同地处理对象,或者前者是否仅仅是后者的语法糖.

Jam*_*aus 1

这两种对象类型应该是等效的。

$ReadOnly<T>使所有属性协变:

$ReadOnly 是表示给定对象类型 T 的只读版本的类型。只读对象类型是其键都是只读的对象类型。

这意味着以下两种类型是等效的:

type ReadOnlyObj = {
  +key: any,  // read-only field, marked by the `+` annotation
};

type ReadOnlyObj = $ReadOnly<{
  key: any,
}>;
Run Code Online (Sandbox Code Playgroud)

$Exact<T>接受一个不精确的对象并使其精确:

$Exact<{name: string}> 是 {| 的同义词 name: string |} 如对象文档中所示。