#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
файлов, он отлично проверял тип.