gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:03:12 34 4
gpt4 key购买 nike

免责声明:一般来说,我还是有点新的 Flow 和静态类型,所以我很可能忽略了这个问题的一些简单/明显的东西。

假设我有一个名为 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.flow 中的类型和 moduleB.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.flowmoduleAmoduleB 文件),但是在根流文件中而不是在 .js.flow 中包含所有类型定义似乎很奇怪与这些类型源自的模块匹配的文件。

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

我将不胜感激任何帮助弄清楚如何最好地组织这个。 (再说一次,我知道我很有可能在做一些愚蠢的事情或忽略一些明显的事情。)

最佳答案

.js.flow的目的|文件的行为与相应的 .js 完全相同实现中的文件,但它们不是由 Babel 翻译的。特别是,他们像对应的 .js 一样导入和导出东西。文件做。另外,就像 .js文件根据它在文件系统中的位置自动与模块相关联,.js.flow 也是如此。文件。

按照问题中的示例,假设 index.jsmodule.exports是一个函数,它返回一个包含属性 someMethod 的对象类型 () => SomeType , 其中类型 SomeTypemoduleA.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.flowmoduleA.js.flowsrc/node_modules/my-module/ ,我们可以通过在 test.js 中添加以下内容来测试我们的设置是否正确在 src/ :
// @flow

var foo = require('my-module');

(foo().someMethod(): number); // error (string incompatible with number)

关于flowtype - 如何避免在模块声明中重复类型定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38949536/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com