Поток: типы фигур и дополнительные необязательные поля - PullRequest
0 голосов
/ 04 июня 2019

Мне часто приходится делать следующее, и Flow делает это глупо трудно:

/* @flow */

type Foo = {
  +foo?: number,
}

type FooBar = {
  +foo?: number,
  +bar?: number,
}

const foo: Foo = {foo: 2}

function process(arg: $ReadOnly<FooBar>) {
}

process(foo)

Есть ли хороший способ сделать это? Я получаю следующую ошибку:

17: process(foo)
            ^ Cannot call `process` with `foo` bound to `arg` because property `bar` is missing in `Foo` [1] but exists in `FooBar` [2].
References:
12: const foo: Foo = {foo: 2}
               ^ [1]
14: function process(arg: $ReadOnly<FooBar>) {
                                    ^ [2]

1 Ответ

1 голос
/ 05 июня 2019

Поток по умолчанию для неточных типов объектов;это означает, что, хотя объявлено, что Foo явно имеет только одно (необязательное) свойство foo типа number, переменная типа Foo теоретически может иметь дополнительные свойства.Например, переменная типа Foo может иметь свойство bar.И, поскольку bar не введено в Foo, тип bar не ограничен (т. Е. Не обязательно number).В результате, если вы должны были взаимодействовать с arg.bar в process и Flow позволял arg иметь тип Foo, вы не гарантированно будете взаимодействовать с number.Таким образом, Flow жалуется.

Один из способов исправить это - использовать точные типы объектов.Если Flow знает, что переменная типа Foo никогда не будет иметь свойства bar, то она может быть безопасно передана в process.Таким образом, вы можете набрать Foo как:

type Foo = {|
  +foo?: number,
|};

Try Flow

(Примечание: тип утилиты $ReadOnly не является необходимым с приведенным выше определениемFoo и исходное определение FooBar, потому что bar недоступно для записи. Хотя, конечно, хорошо хранить $ReadOnly.)

...