Flow(类型)不尊重我为类属性做的手动检查

时间:2018-03-04 16:25:00

标签: javascript flowtype

一个例子:

class MyClass {
  foo: ?string;
  constructor(foo) {
    this.foo = foo;
  }

  doSomething() {
    if (!this.foo) throw new Error();
    console.log('hi'); // if I comment this line, I get no errors!
    const myFoo: string = this.foo;
  }
}

我收到以下错误:

  

12:const myFoo:string = this.foo;                                ^无法将this.foo分配给myFoo,因为null或undefined 1与字符串[2]不兼容。

你可以看到它here

如您所见,我确保设置this.foo。但是,如果在检查之后,执行了任何代码,尽管该代码没有执行任何操作,它会忽略我的检查。

2 个答案:

答案 0 :(得分:1)

Flow不允许这样做,因为就其而言,console.log()调用可能会更改this.foo的值,这是正确的。从理论上讲,Flow可以是特殊情况console.log,因为它不喜欢有副作用,但它可能是任何函数调用。如果你想要这个,你需要首先获取值,例如

doSomething() {
  const foo = this.foo;
  if (!foo) throw new Error();
  console.log('hi');
  const myFoo: string = foo;
}

doSomething() {
  if (!foo) throw new Error();
  const foo = this.foo;
  console.log('hi');
  const myFoo: string = foo;
}

因为foo变量的类型无法更改,因为它不会在任何地方重新分配。

答案 1 :(得分:1)

这是由Flow' Refinement Validations

引起的

这也提供了一个示例解决方法。

只读变量不一定是不可变的。例如,delete this.foo不会导致错误(这可能是流量中的错误,因为它似乎明显违反了类型,但与重新分配不同 - bug report)。