如何基于属性存在性细化Flow不相交联合类型?
解决Flow不相交联合类型的属性存在性细化问题
这个问题我之前也碰到过!Flow确实不会自动把hasOwnProperty的调用当成类型细化的依据,不过有两种简单的解决办法:
方法一:使用in操作符进行类型检查
Flow原生支持用in操作符来细化不相交联合类型,它能识别这种检查并缩小变量的类型范围。只需要把你的判断条件从response.hasOwnProperty('success')改成'success' in response即可:
type Success = {| success: string |}; type Failed = {| error: string |}; type Response = Success | Failed; function handleResponse(response: Response) { if ('success' in response) { // Flow现在能识别这里是Success类型 var value: string = response.success; } else { // 自动推断为Failed类型 var message: string = response.error; } }
方法二:自定义类型守卫函数
如果需要更灵活的类型检查逻辑,可以写一个自定义的类型守卫函数,明确告诉Flow某个值属于特定类型:
type Success = {| success: string |}; type Failed = {| error: string |}; type Response = Success | Failed; function isSuccess(response: Response): response is Success { return response.hasOwnProperty('success'); } function handleResponse(response: Response) { if (isSuccess(response)) { var value: string = response.success; } else { var message: string = response.error; } }
为什么原来的hasOwnProperty不行?
Flow的类型系统不会追踪hasOwnProperty这类方法调用后的类型变化,它没有把这个方法标记为能触发类型细化的操作。而in操作符是Flow专门支持的类型细化语法,自定义类型守卫则通过显式的类型断言让Flow理解你的检查逻辑。
内容的提问来源于stack exchange,提问作者Daniel Hildesson
相关产品推荐
相关产品推荐

