流类型签名出错。为什么?

时间:2017-07-13 06:53:07

标签: flowtype

以下是例子:

https://flow.org/try/#0PQKgBAAgZgNg9gdzCYAoVUCuA7AxgFwEs5swBDMACgAcyAnMgWwGcAuMAb2oEZ3n86hbAHMANGGoAmAPx8BQ4QF8AlOwBucQgBNOi9FjxESYAEZVVnHnMEjFnVGDB0Apvkx1SXXmADk-G8I+igDcqHqoavSmAErOzJgw+GAAvKaUyqGoZJQmsfGJGUA

/* @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}

1 个答案:

答案 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,如上所述。这将打破类型安全。