Flowtype: небезопасный доступ к переменной экземпляра

/* @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

Что это не выдает ошибку типа потока?

Изменить:

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

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

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

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


person M. Walker    schedule 07.12.2016    source источник


Ответы (2)


В настоящее время (v0.36) поля класса не гарантируются Flow

class Foo {
  bar: string;
}

new Foo().bar // no error
person gcanti    schedule 07.12.2016

Похоже, поток правильно перехватывает эти ошибки с 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.
person Robert Balicki    schedule 23.06.2017