为什么JS扩展运算符不能与Flow精确类型一起使用

时间:2018-04-14 11:57:35

标签: javascript flowtype

当我使用Flow定义类型然后使用扩展运算符来处理它时,如果传入参数是A类型且输出类型为A(并且修改后的值为a),为什么Flow认为它是不精确的匹配? A)的财产。

例如,这失败了:

type A = {|
  attrib1: string,
  attrib2: string
|};

const processA = (a: A) : A => {
  return {...a, attrib2: 'hello' };
}

2 个答案:

答案 0 :(得分:2)

这是一个长期存在的错误,但只是(8天前)得到了一些提交!

请参阅https://github.com/facebook/flow/issues/2405

问题可以简化为:

/* @flow */
type A = {| a: string |}
const a: A = {a: 'x'}
const r: A = {...a}

针对master尝试此操作现在正在运行,但不是0.69.0

答案 1 :(得分:0)

看看上一个回答中提到的github问题,我将通过以下方式处理我的问题(直到我可以转到更新的Flow版本):

type _A = {
  attrib1: string,
  attrib2: string
};

type A = _A & $Shape<_A>;

const processA = (a: A) : A => {
  return {...a, attrib2: 'hello' };
}

对于提供的简化示例重新解释此内容,它将如下所示:

/* @flow */
type _A = { a: string }
type A = _A & $Shape<_A>;
const a: A = {a: 'x'}
const r: A = {...a}