我正在尝试编写一个创建类型对象的函数,但允许某些属性被覆盖。 $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' })
但是,如果我删除...attrs
,该错误就会消失。如果我通过b: string
设置了必需的属性,该错误也会消失。
我在这里想念什么?
答案 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' })