我有一个函数返回一个不太具体的类型,由返回更具体类型的东西调用。请参阅此处的链接tryflow
`
/*flow*/
type SimpleObject = {[string]: number}
type Spc = {s: number}
function foo(): SimpleObject {
return {i: 10};
}
function bar(): Spc {
return foo();
}
`
答案 0 :(得分:0)
在您的示例中,Spc
是SimpleObject
的规范,因为{s: number}
非常适合更广泛的类型。 Flow允许您返回更多特定类型,因此可能是问题的原因。
请参阅:https://flow.org/en/docs/lang/variance/
还请注意:
在Flow中,将具有正常对象类型的附加属性的对象传递给我们是安全的。
https://flow.org/en/docs/types/objects/#toc-exact-object-types
当对象类型具有索引器属性时,即使对象在运行时在该插槽中没有值,也会假定属性访问具有注释类型。与数组一样,程序员有责任确保访问的安全性。
您的功能栏进行类型检查,因为〜实现等效
function bar() {
const result = foo();
return {s: result.s};
}
也进行类型检查。如您在堆栈溢出答案中所述,这是 因为索引器属性访问不正确。
换句话说,SimpleObject
和Spc
是彼此的子类型(!):
// @flow
type SimpleObject = {[string]: number}
type Spc = {s: number}
declare var a: SimpleObject;
(a: Spc); // OK
declare var b: Spc;
(b: SimpleObject); // OK
这显然是不合理的,但似乎与Flow的其余部分一致。