Flow 中的属性缺失或未定义

Posted

技术标签:

【中文标题】Flow 中的属性缺失或未定义【英文标题】:Property is missing in null or undefined in Flow 【发布时间】:2019-09-23 03:36:47 【问题描述】:

我将 Flow 与 React 一起使用,并且我有一个使用 State 和 Props 类型的类,如下所示:

type B = x:number

type State = 
  a: ?B
;

type Props = 

class MyClass extends React.PureComponent<Props, State> 
  constructor(props: Props) 
    super(props);
    this.state = 
      a: null,
    ;
  
...
myFunction=()=>

console.log(this.state.a.x)// Flow error here




流错误是:无法获取this.state.a.x,因为未定义中缺少属性x。我的类型定义有什么问题?为什么我应该在构造函数中使用“道具”类型定义(道具:道具)?

【问题讨论】:

【参考方案1】:

?B 表示a 属性与B | null | void 相同。因为你可以做null.xundefined.x Flow 抛出一个有效的异常。例如,为了让您的代码正常工作,您可以更改

console.log(this.state.a.x);

成为

console.log(this.state.a ? this.state.a.x : null);

这样如果a 没有设置为B 值,它将记录null

或者,您可以将类型设为 a: B,但您需要有一个 B 值才能将状态作为初始值,听起来您可能没有,因为您的示例状态设置a: null

【讨论】:

Flow需要改代码吗?因为this.state.a要在console.log之前初始化。所以它永远不会在这个函数中变为 null。 Flow 无法知道这一点。使用 Flow 时,您可以自行设计数据类型,让 Flow 能够静态分析事物的类型。您已将类型声明为 ?B,因此 Flow 正在按照您的指示进行操作。

以上是关于Flow 中的属性缺失或未定义的主要内容,如果未能解决你的问题,请参考以下文章

SCRIPT5009:“JSON”在 IE 10 中未定义属性“$”的值为 null 或未定义,不是函数对象

筛选出具有null或未定义属性的对象

SignalR:无法获取属性“开始”的值:对象为空或未定义

IE:无法获取属性“clientWidth”的值:对象为空或未定义

当第一个属性为空或未定义时如何使用 ES6 对象解构默认为另一个属性

IE9 JavaScript 错误:SCRIPT5007:无法获取属性“ui”的值:对象为空或未定义