Javascript 为什么';JS spread操作符使用流精确类型 当我使用流定义一个类型,然后使用扩展运算符来处理它时,如果传入的参数是A类型,并且输出是A类型(并且修改后的值是A的属性),那么流为什么认为它是不精确匹配的。

Javascript 为什么';JS spread操作符使用流精确类型 当我使用流定义一个类型,然后使用扩展运算符来处理它时,如果传入的参数是A类型,并且输出是A类型(并且修改后的值是A的属性),那么流为什么认为它是不精确匹配的。,javascript,flowtype,Javascript,Flowtype,例如,此操作失败: type A = {| attrib1: string, attrib2: string |}; const processA = (a: A) : A => { return {...a, attrib2: 'hello' }; } 这是一个长期存在的bug,但是(8天前)刚刚得到一些提交 看 这个问题可以归结为: /* @flow */ type A = {| a: string |} const a: A = {a: 'x'} const r: A

例如,此操作失败:

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

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

这是一个长期存在的bug,但是(8天前)刚刚得到一些提交

这个问题可以归结为:

/* @flow */
type A = {| a: string |}
const a: A = {a: 'x'}
const r: A = {...a}
对master进行此尝试现在起作用,但不是0.69.0

  • 大师:
  • 0.69.0:

看看前面的答案中提到的github问题,我将以以下方式处理我的问题(直到我可以转移到更新的Flow版本):

类型_A={
属性1:string,
属性2:字符串
};
A型=_A&$Shape;
常量进程a=(a:a):a=>{
返回{…a,attrib2:'你好'};
}
对于提供的简化示例,重新解释如下:

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

它可以简化为:作为tmp解决方案,在0.69.0示例中,将
{…a}
替换为
对象。赋值(def,{…a})
,它将通过。。尽管需要
const def={a:'x'}
作为默认的/base对象。
/* @flow */
type _A = { a: string }
type A = _A & $Shape<_A>;
const a: A = {a: 'x'}
const r: A = {...a}