如果Flow无法自动推断,如何声明var已经初始化?

时间:2017-02-28 12:36:53

标签: javascript flowtype

尝试this code in Flow's REPL

const numbers = [5, 3, 22, 2, 6];

let max: number;

numbers.forEach(item => {
  if (!max || item > max) max = item;
});

console.log(max++); // type error

我可以确定max将在max++表达式之前初始化为数字。但Flow无法自动推断出这一点,所以它会抱怨。

我想在forEach之后对Flow说:请假设max变量现已初始化。有没有办法做到这一点?

(相关 - Flow有'声明':declare var max: number; - 这可以让您声明全局范围内存在名为var的数字变量。但您无法使用它重新声明已经在你自己的范围内宣布的东西。)

2 个答案:

答案 0 :(得分:1)

您可以按SELECT x.serviceNumber FROM your_table t CROSS JOIN XMLTABLE( XMLNAMESPACE( 'http://www.yourserver.url/json/' AS "json" ), '//root/Input/Body/json:object/json:array/json:object/' PASSING XMLTYPE( '<?xml version="1.0" encoding="utf-8"?>' || '<root xmlns:json="http://www.yourserver.url/json/">' || t.your_xml_column || '</root>' ) COLUMNS serviceNumber NUMBER PATH './json:string[@name="serviceNumber"]' ) x 初始化最大值。这应该可以阻止投诉。

答案 1 :(得分:1)

您也可以用不太可变的方式重写代码:

const numbers = [5, 3, 22, 2, 6];

const max = numbers.reduce((max, item) => item > max ? item : max,
  Number.NEGATIVE_INFINITY);

console.log(max + 1);

这可以避免任何类型的突变,使Flow的生活更轻松(也可能对人类而言:))