【问题标题】:Get type definitions from imported files not marked with @flow从未标记 @flow 的导入文件中获取类型定义
【发布时间】:2016-12-11 22:49:35
【问题描述】:

TL;DR 如何告诉flow 从未使用@flow 声明的导入模块导入类型定义?

加长版

流接缝能够从不使用流语法的文件中派生类型(参见示例)。

示例文件“flow.js”

if(Math.random() < 0.5) {
  var y = "hello";
} else {
  var y = 2;
}

var i = y;

命令'flow建议flow.js'

if(Math.random() < 0.5) {
-  var y = "hello";
+  var y: number | string = "hello";
 } else {
-  var y = 2;
+  var y: number | string = 2;
 }
-var i = y;
+var i: number | string = y;

它还可以使用flow get-importers 列出来自特定文件的所有导入。工具接缝在那里,但我不知道如何自动告诉flow 从我未使用@flow 声明的导入中获取类型定义。

我希望它遍历导入链,计算类型并在标有@flow 的文件中使用它们。我不希望它类型检查代码没有标记@flow,只检索类型。

【问题讨论】:

  • 我不太明白,也许可以这段代码;变量 a = 1; console.log(a.constructor.name); var b = eval(a.constructor.name)(a);
  • 我没有关注。
  • 根据the documentation regarding modules:“Flow 能够为您推断程序中的大多数类型,但是对此规则有一个限制:您必须显式地注释模块的导出。”。
  • @HiDeo ...这就是我要解决的问题:)

标签: javascript flowtype


【解决方案1】:

我把你的问题改写成我相信你的意思。

如何为 Flow 不知道的文件创建类型定义?

有两件事:

  • 如果文件归您所有(即不是 node_modules 内的第三方库等),那么您可以在其旁边创建一个 *.js.flow 文件来记录其导出。
  • 如果该文件归您所有(即node_modules 内的第三方库等),那么您可以在flow-typed/name-of-library.js 内创建一个 libdef 文件

对于.js.flow 文件,您可以这样编写定义:

// @flow
declare module.exports: { ... }

对于 libdef 文件,您可以这样编写定义:

declare module "my-third-party-library" {
  declare module.exports: { ... }
}

希望能回答你的问题

【讨论】:

  • 抱歉,没有。我正在寻找一种自动化的方式来在我的项目中以递归方式在所有导入上派生类型注释。
  • 我不知道你在问什么,你需要更好地改写它
  • 有什么特别要我澄清的吗?注意我提到的工具flow suggestionflow get-importers
  • 您是否正在寻找为get-importers 中的每个模块运行flow suggest 的脚本?或者您是否要求使用 flow suggest 的结果更新模块
  • 我希望 flow 对所有带有 @flow 注释的文件进行类型检查,并从整个导入链中获取类型。因此,如果模块A 导入B 并且只有A 具有@flow 标记,它应该仍然能够使用来自B 的类型——但它不应该对B 进行类型检查。因此,使用flow check 时,只会显示带有@flow 标记的文件。
猜你喜欢
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-10
  • 2023-01-04
  • 2021-11-07
相关资源
最近更新 更多