Flow вызывает ошибку при присвоении null свойству интерфейса, но не эквивалентной переменной.

Может кто-нибудь объяснить, почему это работает:

const foo: number | null = null;

А следующего нет? Для меня они такие же, но Flow обнаружил ошибку.

interface Bar {
  foo: number | null;
}

const bar: Bar = {
  foo: null,
}
// Error
27:   foo: null,
           ^ Cannot assign object literal to `bar` because null [1] is incompatible with number [2] in property `foo`.
References:
27:   foo: null,
           ^ [1]
23:     foo: number | null;
             ^ [2]

Попробуйте демо-версию Flow

Похоже на ошибку - если вы измените interface на type Bar = { foo: number | null; }, он будет работать должным образом

Aleksey L. 10.09.2018 12:17

Я не могу объяснить, почему interface выдает ошибку, но в данном случае вам действительно нужен обычный псевдоним тип объекта, как в комментарии @ AlekseyL. Flow интерфейсы предназначены только для работы с экземплярами классов, а не с объектами, которые вы создаете с синтаксисом литерала объекта.

Rory O'Kane 16.09.2018 07:17
4
2
248
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно документация, «свойства интерфейса по умолчанию неизменны». Мы видим, что это приводит к ошибке при попытке присвоить литерал объекта типизированной переменной,

interface Invariant { property: number | string }

var value1: Invariant = { property: 42 }; // Error!

Попробуйте Flow

Однако свойство можно изменить после назначения,

interface Invariant { property: number | string }

function method1(value: Invariant) {
  value.property;        // Reading works!
  value.property = 3.14; // Writing works!
}

Попробуйте Flow

В вашем случае вы можете написать

interface Bar { foo: number | null };

function method1(bar: Bar) {
  bar.foo = null;
}

Попробуйте Flow

Вы также можете implement Bar для класса и назначить свойство foo

interface Bar { foo: number | null };

class X implements Bar {
  foo: number | null;

  constructor() {
    this.foo = null;
  }
}

Попробуйте Flow

Другие вопросы по теме