流式输入返回类型的函数,您可以在其中重写某些属性

时间:2018-12-20 23:50:14

标签: javascript flowtype

我正在尝试编写一个创建类型对象的函数,但允许某些属性被覆盖。 $Shape<T>似乎可以满足我的要求,因为它"Copies the shape of the type supplied, but marks every field optional."

但是,当我将$Shape<A>散布在类型为A的有效对象中时,该对象存在一个可选属性,会发生流错误:

// @flow

type A = {
  a: number,
  b: ?string,
}

function foo(attrs: $Shape<A>): A {
  return {
    a: 123,
    b: 'asd', // <- string incompatible with null
    ...attrs, 
  }
}

foo({ b: 'foo' })

Try flow link

但是,如果我删除...attrs,该错误就会消失。如果我通过b: string设置了必需的属性,该错误也会消失。

我在这里想念什么?

1 个答案:

答案 0 :(得分:0)

您只需将?放在错误的:

type A = {
  a: number,
  b?: string,
}

编辑:

经过讨论,问题似乎在于在参数中内联定义$ Shape类型。

我最好在外面设置它,还为该类型添加了索引器:

// @flow

type A = {
  [key: string]: string|number|null,
  a: number,
  b: string,
}
type ADetails = $Shape<A>;

function foo(attrs: ADetails): A {
  return {
    ...attrs,
  }
}

foo({ b: 'foo' })