如何避免在模块声明中重复类型定义?

时间:2016-08-15 05:01:13

标签: flowtype

免责声明: 我仍然有点新流量和静态类型,所以我很有可能用这个问题忽略了一些容易/明显的东西。

假设我有一个名为my-library的库。该库向其用户index.js公开了一个模块,该模块导入了一些其他模块(moduleA.jsmoduleB.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.flowmoduleB.js.flow中的类型。 (我有moduleA.js.flowmoduleB.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.jsmoduleB.js导入它们(而不包括.js.flow moduleA个文件{1}}和moduleB),但是根流文件中的所有类型定义而不是.js.flow文件中与这些类型源自的模块匹配似乎很奇怪。

或者,我知道我可以在各自的模块中定义开发类型,并在index.js.flow模块声明中再次定义它们,但我不想重复在如果可能,两个不同的地方。

我非常感谢任何帮助,找出如何最好地组织这个。 (再一次,我知道我有一个非常可靠的机会,我做了一些愚蠢的事情或者忽略了一些显而易见的事情。)

1 个答案:

答案 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/