【问题标题】:Error in flow type signature. Why?流类型签名错误。为什么?
【发布时间】:2017-07-14 02:41:47
【问题描述】:

这是一个例子:

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} 的一部分?

【问题讨论】:

    标签: flowtype


    【解决方案1】:

    {p1: string, p2?: string} 类型表示如果此类型的值具有p2 属性,则它必须是string。 Flow 的宽度子类型意味着b 函数可以返回{p1: 'foo', p2: 6}。基本上,如果你有 {p1: string} 类型的东西,你就知道它有一个 p1 属性,但你对它的其他属性一无所知。

    因此,如果 Flow 允许您获取 {p1: string} 类型的内容并将其传递给需要 {p1: string, p2?: string} 类型的 a 函数,则 a 函数可以检查 p2 属性是否存在,如果是这样,它可以假设它是string。但是,它实际上可能是number,如上所述。这会破坏类型安全。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-09
      • 1970-01-01
      • 2015-06-14
      相关资源
      最近更新 更多