为什么这个代码使用flow来正确检查

时间:2018-01-22 20:43:25

标签: javascript flowtype

我有一个函数返回一个不太具体的类型,由返回更具体类型的东西调用。请参阅此处的链接tryflow

`

/*flow*/

type SimpleObject = {[string]: number}

type Spc = {s: number}

function foo(): SimpleObject {
  return {i: 10};
}

function bar(): Spc {
  return foo();
}

`

1 个答案:

答案 0 :(得分:0)

在您的示例中,SpcSimpleObject规范,因为{s: number}非常适合更广泛的类型。 Flow允许您返回更多特定类型,因此可能是问题的原因。

请参阅:https://flow.org/en/docs/lang/variance/

还请注意:

  

在Flow中,将具有正常对象类型的附加属性的对象传递给我们是安全的。

     

https://flow.org/en/docs/types/objects/#toc-exact-object-types

     

当对象类型具有索引器属性时,即使对象在运行时在该插槽中没有值,也会假定属性访问具有注释类型。与数组一样,程序员有责任确保访问的安全性。

     

https://flow.org/en/docs/types/objects/#toc-objects-as-maps

说明from the flow github issue tracker

您的功能栏进行类型检查,因为〜实现等效

function bar() {
  const result = foo();
  return {s: result.s};
}

也进行类型检查。如您在堆栈溢出答案中所述,这是 因为索引器属性访问不正确。

换句话说,SimpleObjectSpc是彼此的子类型(!):

// @flow
type SimpleObject = {[string]: number}
type Spc = {s: number}

declare var a: SimpleObject;
(a: Spc);  // OK

declare var b: Spc;
(b: SimpleObject);  // OK

这显然是不合理的,但似乎与Flow的其余部分一致。