Объявление класса Flowtype несовместимо с его реализацией

#javascript #flowtype

#javascript #flowtype

Вопрос:

У меня есть некоторый класс (в этом примере он назван B ), определенный в b.js файле, и его объявление определено в b.js.flow файле. Я предположил, что flowtype связывает классы с его объявлениями, но, к сожалению, когда я попытался использовать некоторую функцию, которая принимает экземпляр класса B внутри своего метода flowtype, возникла следующая ошибка:

 b.js:9
  9:     return this.a.foo(this)
                ^^^^^^^^^^^^^^^^ call of method `foo`
  5: export default class B {
                          ^ B. This type is incompatible with
  6:   foo(b: B): null;
              ^ B. See: a.js.flow:6
  

Я предполагаю, что это вызвано обработкой классов как номинальных типов. Есть ли какой-либо способ связать реализацию класса с его объявлением, чтобы предотвратить эту ошибку?

Существует полное содержимое файлов, которые я использовал для тестирования:

a.js:

 // @flow

import type B from './b'

export default class A {
  foo(b: B) {
    return null
  }
}
  

a.js.flow:

 // @flow

import type B from './b'

declare export default class A {
  foo(b: B): null;
}
  

b.js:

 // @flow

import A from './a'

export default class B {
  a: A;

  bar() {
    return this.a.foo(this)
  }
}
  

b.js.flow:

 // @flow

import type A from './a'

declare export default class B {
  a: A;
  bar(): null;
}
  

Ответ №1:

.js.flow файлы не предназначены для размещения рядом со своими .js аналогами, если .js файлы также проверяются потоком. Цель состояла в том, чтобы позволить пользователям публиковать объявления типов потоков в npm путем (а) переноса исходных исходных файлов, чтобы люди могли запускать их без собственного шага переноса, и (б) добавления .flow расширения к исходным исходным файлам, которые все еще имеют типы, поэтому Flow может проверять тип. типизированный по потоку предпочтительнее этого подхода по разным причинам, но это отдельный вопрос.

.js.flow файлы не предназначены для использования в качестве .h файлов объявления стиля. Скорее всего, лучшее решение для этого — просто удалить ваши .js.flow файлы. Когда я тестировал ваш пример без .js.flow файлов, он отлично проверял тип.