以下是例子:
/* @flow */
function a (params: {p1: string, p2?: string}): void {}
function b (): {p1: string} {
return {p1: 'string'};
}
var bResult = b();
a(bResult);
我遇到了流量错误
3: function a (params: {p1: string, p2?: string}): void {}
^ property `p2`. Property not found in
11: a(bResult);
^ object type
为什么会出现这种错误?
为什么签名{p1: string}
不属于{p1: string, p2?: string}
?
答案 0 :(得分:2)
类型{p1: string, p2?: string}
表示如果此类型的值具有p2
属性,则该值必须为string
。 Flow的宽度子类型意味着b
函数可以返回{p1: 'foo', p2: 6}
。基本上,如果你有{p1: string}
类型的东西,你知道它有p1
属性,但你对其它属性一无所知。
因此,如果Flow允许您使用{p1: string}
类型的某些内容并将其传递给期望类型为a
的{{1}}函数,则{p1: string, p2?: string}
函数可以检查a
属性是否存在,如果存在,则可以假定它是p2
。但是,它实际上可能是string
,如上所述。这将打破类型安全。