免责声明: 我仍然有点新流量和静态类型,所以我很有可能用这个问题忽略了一些容易/明显的东西。
假设我有一个名为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剥离,我想要它们仍然存在于图书馆用户的某个地方。)
我知道以下内容没有使用导入my-module
的外部JS进行检查:
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
个文件{1}}和moduleB
),但是根流文件中的所有类型定义而不是.js.flow
文件中与这些类型源自的模块匹配似乎很奇怪。
或者,我知道我可以在各自的模块中定义开发类型,并在index.js.flow
模块声明中再次定义它们,但我不想重复在如果可能,两个不同的地方。
我非常感谢任何帮助,找出如何最好地组织这个。 (再一次,我知道我有一个非常可靠的机会,我做了一些愚蠢的事情或者忽略了一些显而易见的事情。)
答案 0 :(得分:7)
.js.flow
文件的目的是与您实施中的相应.js
文件一样完全,除之外,它们不会被翻译巴贝尔。特别是,它们导入和导出的东西就像对应的.js
文件一样。此外,就像.js
文件根据模块驻留在文件系统中的位置自动与模块关联一样,.js.flow
文件也是如此。
按照问题中的示例,假设index.js
的{{1}}是一个返回包含module.exports
类型属性someMethod
的对象的函数,其中类型() => SomeType
导出SomeType
。然后我们可以在moduleA.js
:
index.js.flow
以下// @flow
import type { SomeType } from './moduleA'
declare module.exports: () => {
someMethod: () => SomeType;
};
:
moduleA.js.flow
假设我们将// @flow
export type SomeType = string;
和index.js.flow
放在moduleA.js.flow
中,我们可以通过src/node_modules/my-module/
test.js
中的以下内容测试我们的设置是否正确:
src/