Flowtype:不安全的实例变量访问

时间:2016-12-07 05:40:27

标签: javascript ecmascript-6 flowtype es6-class

/* @flow */

class Foo {
    blah: string;
    bar: string;
    constructor(blah: string, bar?: string) {
            this.blah = blah
            if (bar) {
                this.bar = bar
            }
    }
}

const foo = new Foo('okok')
foo.bar

https://flowtype.org/try/#0PQKgBAAgZgNg9gdzCYAoVBjGBDAzrsAMTjjAG9UBIAI2wCcAuMXAFzoEsA7AcwG5UAvugxxOrMFBJgAvGE4BTJMTgAKAJSpJcAHS06QA

这不会引发一个flowtype错误?

修改

这可能会回答我的问题......

https://flowtype.org/docs/nullable-types.html#undefined-values-and-optional-types

  

未定义的值和可选类型未定义的值,就像null一样,   也可能导致问题。不幸的是,未定义的值无处不在   在JavaScript中,如果没有严重影响,很难避免它们   语言的可用性。例如,数组可以有孔   要素;可以动态添加和删除对象属性。流   忽略了由object属性导致的未定义的可能性   和数组元素访问。更严格会迫使程序员   对每个取消引用进行未定义的检查(如空检查)   数组元素或对象属性,以完成任何有用的工作。

     

但是,Flow会检测未定义的局部变量并返回值,   并且它可能考虑可选参数和属性   未定义。因此,必须通过未定义来保护这些类型的使用   检查以避免错误。

2 个答案:

答案 0 :(得分:2)

Flow

目前无法确保(v0.36)类字段
class Foo {
  bar: string;
}

new Foo().bar // no error

答案 1 :(得分:0)

0.47开始,流正确地捕获了这些错误(可能是某些早期版本)。

作为一个警告,如果你扩展一个流不理解的类,它将不会捕获这些错误。

// @flow
import Model from './Model'; // a non-flown file
class A extends Model {}
const a = new A();
a.bar; // will not fail, because Model might have a bar field.