精炼混合到Flow

时间:2017-07-24 09:29:26

标签: javascript flowtype

我们正在尝试在Flow中进行类型细化,以防止在外部接口上进入应用程序的值。为此,我们使用mixed,然后尝试优化已知类型,但Flow并不容易!

以下内容似乎应该有效,我已经验证mixed类型值符合response类型的要求。

type Response = { head: string }

const refineToResponse = (value: mixed): ?Response => {   
  if (value
    && typeof value === "object"
    && typeof value.head === "string") {

    return value;   
  }

  return null; 
};

但是我收到了一条非常无用的错误消息:

16:     return value;
               ^^^^^ object. This type is incompatible with the expected return type of
11: const refineToResponse = (value: mixed): ?Response => {
                                              ^^^^^^^^ object type   
     

属性head不兼容:

 11: const refineToResponse = (value: mixed): ?Response => {
                                                 ^^^^^ mixed. This type is incompatible with
  8:   head: string
             ^^^^^^ string

编辑:

A link to the code on TryFlow

1 个答案:

答案 0 :(得分:5)

这样会不安全。如果某些东西在运行时具有类型string,则并不意味着它具有相同的静态类型,例如它可能是一些枚举:'Foo' | 'Bar',因此只需string就可以实现不安全的突变。另一方面,它可能是number | string,因此将来head可能会成为一个数字或任何类型。

相反,您可以执行以下操作:

const refineToResponse = (value: mixed): ?Response => {   
  if (value
    && typeof value === "object"
    && typeof value.head === "string") {

    return { head: value.head };   
  }

  return null; 
};