2016-12-07 2 views
0
/* @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/#0PQKgBAAgZgNg9gdzCYAoVBjGBDAzrsAMTjjAG9UBIAI2wCcAuMXAFzoEsA7AcwG5UAvugxxOrMFBJgAvGE4BTJMTgAKAJSpJcAHS06QAFlowtype: Опасное экземпляр переменного доступ

Что это не бросать ошибку flowtype?

Edit:

Это потенциально отвечает на мой вопрос ...

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

Неопределенные значения и дополнительные типы неопределенные значения, так же, как нуль, может вызвать проблемы тоже. К сожалению, неопределенные значения являются вездесущими в JavaScript, и их трудно избежать, без серьезного воздействия на удобство использования языка. Например, в массивах могут быть отверстия для элементов; свойства объекта можно динамически добавлять и удалять. Поток игнорирует возможность неопределенности в результате свойства объекта и доступа к элементам массива. Быть более строгим заставит программиста выполнять неопределенные проверки (например, нулевые проверки) при каждом разыменовании элемента массива или свойства объекта , чтобы получить что-либо полезное.

Однако поток обнаруживает неопределенные локальные переменные и возвращает значения , и он считает, что необязательные параметры и свойства могут быть undefined. Таким образом, использование этих типов должно быть защищено неопределенными проверками, чтобы избежать ошибок.

ответ

2

В настоящее время (v0.36) полей класса не обеспечивается потоком

class Foo { 
    bar: string; 
} 

new Foo().bar // no error 
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. 
Смежные вопросы