在Flow中缺少可选的类型检查失败

问题描述 投票:0回答:1

假设我有一个像这样的Flow typedef:

type ApiResponse = {
  +foo?: { [string]: Object },
  +bar?: { [string]: Object},
}

type FooApiResponse = {
  foo: { [string] : Object }
}

并且具有以下签名的函数:

function does_not_accept(baz : ApiResponse) : void  {
  if(baz.foo) { console.log(baz.foo) }
}

function also_does_not_accept(baz: $Shape<ApiResponse>) : void {
  if(baz.foo) { console.log(baz.foo) }
}

在参数位置使用FooApiResponse调用其中一个函数失败。

第一个失败,bar缺少属性错误(即使它是可选的。)

第二个失败是因为bar是只读的(即使它从未被写入。)

我如何编写一个接受ApiResponse的各种“子类型”的函数

$Supertype<ApiRsponse>这样的参数类型签名有效 - 但我不明白为什么。 FooApiResponseApiResponse之间的子/超级关系是如何解决的?这叫什么问题?我甚至不知道谷歌的词汇来回答这个问题。

javascript javascript-objects flowtype
1个回答
0
投票

$Shape$Supertype是实验性的特征。如果他们没有做你想做的事情,或者希望他们做什么,可以考虑打开一个问题。

除了Object之外,ApiResponse没有超类型。它可能有效,因为你正在剥离定义的属性 - 与使用{}相同。我怀疑它打算用于使用extends的类类型。

如果你专门为FooApiResponse键入一个对象文字,那么即使它们具有相同的形状,你也不希望它被接受为ApiResponse。您需要在参数类型上使用交集以允许它接受。

function accept(baz: ApiResponse | FooApiResponse) {}

我认为显示的Flow错误是无益的,所以可能会为此打开一个问题。表示只读的+似乎也混淆了错误,但你没有在FooApiResponse定义中使用它,因此类型与foo不兼容。

© www.soinside.com 2019 - 2024. All rights reserved.