如何使用Flow类型执行写入运行时类型检查表达式?

时间:2018-02-07 10:58:21

标签: javascript flowtype

假设我在Flow中定义了两种类型:

type A = {
  x : string; 
};

type B = {
  y : string; 
};

现在我有一个这样的函数f

const f = (o : A | B) : string => {
  if (o isa A) { // Not real code
    return o.x;
  }
  return o.y;
};

如何实施o isa A

我想创建一个表达式,在运行时根据Flow类型定义检查对象。

编译后的代码可能如下所示:

const f = o => {
  if (typeof(o.x) !== 'undefined') {
    return o.x;
  }
  return o.y;
};

1 个答案:

答案 0 :(得分:2)

这里有两个主要问题。

  1. 没有任何内容表明B类型的对象也不具备x属性,就像A一样,反之亦然。
  2. Flow并不是非常聪明,可以通过这种方式区分对象类型。
  3. 首先,要明确的是,您现有的定义适用于

    var o: B = {
      x: 45,
      y: "string",
    };
    

    因为{ y: string }表示" ystring"的对象,而不是"只有的对象一个y string。"

    要获得您期望的行为,您需要使用Flow Exact Object Syntax作为

    type A = {|
      x : string; 
    |};
    
    type B = {|
      y : string; 
    |};
    

    现在到第二点,最简单的方法是

    const f = (o : A | B) : string => {
      if (typeof o.x !== "undefined") {
        return o.x;
      }
      if (typeof o.y !== "undefined") {
        return o.y;
      }
      throw new Error("Unreachable code path");
    };
    

    向Flow明确指出属性存在的两种情况是唯一可以返回字符串的两种情况。