Объявите объект общей формы в Flow - PullRequest
3 голосов
/ 26 марта 2019

Рассмотрим функцию:

const f = k => v => array =>
  array.reduce(
    (total, current) => ({
      ...total,
      [current[k]]: current[v]
    }),
    {}
  );

Эта функция принимает ключ k, значение v, а затем массив объектов в качестве входных данных и возвращает объект, подобный карте, где ключи и значения являютсяберется из значений ключа k и значения v.Например,

const k = 'key';
const v = 'value';
const input = [{ key: 1, value: 100 }, { key: 2, value: 200 }, { key: 3, value: 300 }];

f(k)(v)(input); // -> { '1': 100, '2': 200, '3': 300 }

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

const k = 'key';
const v = 'value';
{ [k]: 123, [v]: 456 }; // -> { 'key': 123, 'value': 456 }

Пока что я нахожусь в этой точке:

const f = <K>(k: K) => <V>(v: V) => (array: Array<{ [k]: K, [v]: V }>) =>
  array.reduce(
    (total, current) => ({
      ...total,
      [current[k]]: current[v]
    }),
    {}
  );

, что является технически допустимым синтаксисом потока, но дает мне ошибку:

1: const f = <K>(k: K) => <V>(v: V) => (array: Array<{ [k]: K, [v]: V }>) =>
                                                        ^ Cannot use `K` as a type because `K` is a value. To get the type of a value use `typeof`

Как объявить тип, который является объектом формы, полученным из ранее объявленных универсальных типов?Возможно ли это в Flow?

1 Ответ

0 голосов
/ 03 апреля 2019

Синтаксис { [...]: ... } в Flow не означает то же самое, что и в ES6. { [k]: K, [v]: V } не означает, что объект должен иметь ключ k типа K и ключ v типа V. Вместо этого синтаксис используется для обозначения свойства индексатора в Flow . Таким образом, { [k]: K, [v]: V } недопустимо, поскольку вы можете указать только одно свойство индексатора. Однако, допустим, у нас было только { [k]: K }. Это все равно не будет работать должным образом, поскольку это будет представлять тип «объект с ключами типа k, которые сопоставляются со значениями типа K

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

...