FlowJS-给出类型错误,因为它无法识别`typeof`语句的结果

时间:2018-11-07 23:02:09

标签: javascript flowtype

以下代码导致错误:

type NextItem = string | { [string]: string };

const next: NextItem = 'foo';
const isString = typeof next === 'string';
const toName = isString ? next : Object.keys(next)[0];
                                 ^ string [1] is not an object.

但是摆脱isString变量可以解决此问题:

type NextItem = string | { [string]: string };

const next: NextItem = 'foo';
const toName = typeof next === 'string' ? next : Object.keys(next)[0];

我了解为什么,但我希望有人可能会提供更好的解决方案。我需要重用isString变量,并希望使我的代码既干燥又简单(易于阅读)。因此,请不要使用任何“聪明的”(hacky)解决方案。

1 个答案:

答案 0 :(得分:1)

Flow的优化通常基于使用时的直接检查,因此它只会将您的isString变量视为boolean,没有特殊含义。

这为您提供了一些单独的选择:

  • 调整代码的控制流,以便有两个清晰的分支,假设对isString有更多的检查,您始终可以创建一个清晰的分支来处理这两种情况。
  • 内联typeof next === 'string'检查。

    const toName = typeof next === 'string' ? next : Object.keys(next)[0];
    
  • 使用predicate function集中isString逻辑

    function isString(arg: mixed): boolean %checks {
       return typeof arg === "string"; 
    }
    
    const toName = isString(next) ? next : Object.keys(next)[0];