考虑代码:
// @flow
type Params = {
value: ?number,
}
function acceptsMaybeNumber({
// Error:(6, 3) null or undefined [1] is incompatible with number [2].
// value = 4 // <--- DOESN'T WORK
// Error:(7, 3) null or undefined [1] is incompatible with number [2].
// Error:(7, 11) null [1] is incompatible with number [2].
// value = null // <--- DOESN'T WORK
// Error:(15, 3) null or undefined [1] is incompatible with number [2].
// Error:(16, 11) undefined [1] is incompatible with number [2].
// value = undefined // <--- DOESN'T WORK
value // <-- WORKS
}: Params) {
console.log(value);
}
由于value
类型中的Params
键接受number
,null
和undefined
类型,因此请将此键的默认值设置为其中之一应有效,但会引发以下错误。
为什么会这样?
答案 0 :(得分:2)
这是一个流程中的错误。 https://github.com/facebook/flow/issues/183#issuecomment-358607052。最简单的修复可能只是不依赖于默认的解构值。像
这样的东西type Params = {
value?: ?number,
}
function acceptsMaybeNumber(params: Params) {
const value = typeof params.value === 'number' ? params.value : 4
console.log(value);
}
答案 1 :(得分:2)
如@TLadd所述,它似乎确实是bug。
问题特别在于使用默认值进行对象解构时使用null
作为允许类型。
$FlowFixMe
可用于抑制错误,以避免损坏您的代码,或者您可以create your own suppression,例如$FlowDestructuringDefaultBug
。注意:您需要将$ Flow抑制注释放在默认赋值之前的行上,因此您需要像在原始示例中那样在多行中断开参数。
以下是一些可能适合您的用例(Try)的替代方案:
// @flow
type MaybeParams = {
value: ?number,
}
function acceptsMaybeNumber({
// originalValue = 1 // FAIL
// $FlowFixMe
value = 1, // PASS (but not in Try where $FlowFixMe is disabled)
}: MaybeParams) {
console.log(value);
}
type OptionalParams = {
value?: number,
}
function acceptsOptionalNumber({
value = 1, // PASS
}: OptionalParams) {
console.log(value);
}
acceptsOptionalNumber({ }) // PASS
type UndefinedParams = {
value: void | number,
}
function acceptsUndefinedNumber({
value = 1, // PASS
}: UndefinedParams) {
console.log(value);
}
acceptsUndefinedNumber({ value: undefined }) // PASS
如果您特别希望将null作为允许的指定值处理,那么您将不得不在解构中避免使用默认值。