Заявление об ограничении ответственности: я все еще немного новичок в Flow и статической типизации в целом, поэтому вполне возможно, что я упускаю из виду что-то простое / очевидное в этом вопросе.
Скажем, у меня есть библиотека под названием my-library
. Библиотека предоставляет пользователям один модуль index.js
, который импортирует пару других модулей (moduleA.js
и moduleB.js
) для внутреннего использования.
Я хочу использовать Flow с этой библиотекой как для собственной разработки, так и в index.js.flow
файле с объявлением модуля для пользователей библиотеки, которые также используют Flow. Таким образом, файловая структура будет выглядеть примерно так:
- index.js
- index.js.flow (contains the module declaration for library users)
- moduleA.js
- moduleA.js.flow (just exported type definitions, no module declaration)
- moduleB.js
- moduleB.js.flow (just exported type definitions, no module declaration)
Проблема в том, что объявление модуля index.js.flow
должно использовать типы как из moduleA.js.flow
, так и из moduleB.js.flow
. (Причина, по которой у меня есть moduleA.js.flow
и moduleB.js.flow
вместо того, чтобы просто определять типы непосредственно в файлах .js, заключается в том, что определения типов в файлах .js будут удалены Babel, и я хочу, чтобы они все еще существовали где-то для пользователей библиотеки).
Я знаю, что следующее не выполняет проверку типов с помощью внешнего JS, который импортирует my-module
:
index.js.flow (это не работает)
import type { SomeType } from './moduleA'
declare module 'my-module' {
declare function exports(): {
someMethod: () => SomeType
}
}
SomeType, похоже, не может использоваться в объявлении модуля при его импорте, но определение его локально работает:
index.js.flow (это работает)
export type SomeType = string
declare module 'my-module' {
declare function exports(): {
someMethod: () => SomeType
}
}
Таким образом, одно из решений - просто определить и экспортировать все типы из index.js.flow
и просто импортировать их moduleA.js
и moduleB.js
(без включения файлов .js.flow
для moduleA
и moduleB
), но кажется странным иметь все определения типов в корневом потоке file вместо .js.flow
файлов, соответствующих модулям, из которых происходят эти типы.
В качестве альтернативы я знаю, что могу определить типы в соответствующих модулях для разработки и просто снова определить их в объявлении модуля index.js.flow
, но я бы предпочел не повторять определения типов в двух разных местах, если это возможно.
Я был бы очень признателен за любую помощь в выяснении того, как это лучше всего организовать. (И опять же, я знаю, что есть довольно большая вероятность, что я делаю что-то глупое или упускаю из виду что-то очевидное.)
import type ...
вместоimport ...
? Итак, ваша первая попытка будет начинаться сimport type { SomeType } from './moduleA'
- person Michiel Dral   schedule 16.08.2016