Невозможно устранить ошибки [подписи-проверка-сбой] и [несовместимость-вызов] в Flow

У меня есть файл Foo.js:

    // @flow
    export const Foo = ((
      x: number,
      y: number
    ) => {
      class Foo {
        bar1: number;
        bar2: number;
    
        constructor(x: number, y: number) {
            this.bar1 = x;
            this.bar2 = y;
        }
      }
    
      return Foo;
    })();

Проверка потока возвращает следующие ошибки:

Невозможно создать типизированный интерфейс для этого модуля. Вы должны аннотировать экспорт этого модуля с помощью типов. Невозможно определить тип этого выражения вызова. Предоставьте аннотацию, например, добавив тип, приведенный к этому выражению.

Невозможно вызвать функцию, потому что функция [1] требует другого аргумента. Поток (несовместимый вызов)

Foo.js (2, 21): [1] функция

Если я внесу это изменение в последнюю строку, ошибки исчезнут:

    })(): void;

Но новая ошибка:

Неожиданный токен :, ожидался токен ;Flow (ParseError)

что заставляет меня думать, что это может быть неправильное решение. Причина, по которой модуль отформатирован как таковой, заключается в том, что он используется как объект в других файлах, например: new Foo(1,2)


person jlewkovich    schedule 01.11.2020    source источник


Ответы (1)


По сути, у вас есть две проблемы, обе не связанные между собой.

Невозможно создать типизированный интерфейс для этого модуля. Вы должны аннотировать экспорт этого модуля с помощью типов. Невозможно определить тип этого выражения вызова. Предоставьте аннотацию, например, добавив тип, приведенный к этому выражению.

Этот первый вызван архитектурой «сначала типы», что означает, что всякий раз, когда вы экспортируете переменную в модуль, вы должны явно вводить, что это такое. Вы можете найти объяснение здесь.


Невозможно вызвать функцию, потому что функция [1] требует другого аргумента. Поток (несовместимый вызов)

Это связано с тем, что вы создали анонимную функцию, которую вызываете непосредственно перед ее экспортом, эта вызываемая функция ожидает x и y в виде чисел, но вы вызываете ее ни с чем.


Исправление будет выглядеть как этого. Все, что я сделал, - это создал тип interface для экспорта и вызвал анонимную функцию с (1, 2). Вам решать, действительно ли это то, что вы хотите для своего варианта использования, но вы можете настроить код для своего использования, поскольку я сомневаюсь, что вы действительно хотите жестко кодировать (1, 2).

// @flow
interface FooT {
  // something
}

export const Foo: FooT = ((
  x: number,
  y: number
) => {
  class Foo {
    bar1: number;
    bar2: number;

    constructor(x: number, y: number) {
        this.bar1 = x;
        this.bar2 = y;
    }
  }

  return Foo;
})(1, 2);

person Brianzchen    schedule 01.11.2020