为何Flow无法识别这段简单的逻辑?
Flow未检测到解构赋值中
a为undefined的问题分析与解决 当你写出以下代码时,Flow不会标记解构出的a为undefined——哪怕实际运行时a的值明显是undefined,而且你硬把它标注为存在的字符串类型也不会报错:
const maybeObject: ?{a: string} = null const { a }: {a: string} = maybeObject || {}
问题原因
Flow会优先信任你手动添加的类型标注{a: string},默认认为这里的解构对象一定包含a且是字符串类型,不会再去校验右侧表达式maybeObject || {}的实际类型(这个表达式的类型其实是{a: string} | {})。换句话说,你手动指定的类型覆盖了Flow的自动类型推导,相当于做了一次类型断言,跳过了原本应该有的类型检查。
解决办法
移除手动类型标注,让Flow自动推导
删掉解构时的类型标注,Flow就能正确识别a的类型为string | undefined:const maybeObject: ?{a: string} = null const { a } = maybeObject || {}修改类型标注为可选属性
如果一定要显式标注类型,把结构改成包含可选属性的形式,这样Flow就能检测到a可能为undefined:const maybeObject: ?{a: string} = null const { a }: {a?: string} = maybeObject || {}给
a设置默认值
确保a始终有字符串类型的值,避免出现undefined:const maybeObject: ?{a: string} = null const { a = '' }: {a: string} = maybeObject || {}
内容的提问来源于stack exchange,提问作者Athe
相关产品推荐
相关产品推荐

