Flowtype - создание запечатанного пустого объекта

В документации Flow сказано: When you create an object without any properties, you create an unsealed object type in Flow. Можно ли создать запечатанный объект без свойств?

Мой вариант использования выглядит следующим образом. Я хочу инициализировать state пустым объектом и присвоить состоянию следующий тип:

type EmployeesViewState = {|
  employeesRequest?: Request<Array<Employee>>,
  geosRequest?: Request<Array<Geo>>,
|};

Ошибка, которую я получаю, когда пытаюсь назначить пустой объект,

 33:   state: EmployeesViewState = {};
                                   ^^ object literal. Inexact type is incompatible with exact type
 33:   state: EmployeesViewState = {};
              ^^^^^^^^^^^^^^^^^^ exact type: object type

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

Я могу обмануть поток, сказав const a: any = {}; state = a;, но это выглядит очень глупо. Есть ли другие способы решения этой проблемы?


person Robert Balicki    schedule 06.06.2017    source источник
comment
Вы можете рассмотреть возможность сделать свойства необязательными и вместо этого сделать их обнуляемыми. например employeesRequest: ?Request<Array<Employee>>,, затем по умолчанию employeesRequest: null.   -  person loganfsmyth    schedule 06.06.2017


Ответы (1)


Это, безусловно, одна из проблем Flow. Тем не менее, у него есть довольно простой обходной путь. Просто передайте свой объект через Object.freeze:

Object.freeze({})

Конечно, это работает только в том случае, если вы не собираетесь его мутировать, но я обнаружил, что в таких случаях я все равно редко хочу этого делать.

person Nat Mote    schedule 08.06.2017
comment
Можете ли вы привести пример объявления типа, использующего этот метод? Когда я пытаюсь это сделать, я получаю сообщение об ошибке, см. здесь. - person fraxture; 31.05.2018