有没有必要做进口类型'而不是“导入”。与流量?

时间:2018-05-21 02:03:35

标签: javascript ecmascript-6 flowtype commonjs

Flow允许您使用以下语法导入类型:

// SomeClass.js
export default class SomeClass {}

// SomeFile.js
import type SomeClass from './SomeClass';

使用import type代替import的好处是什么?它是否告诉Flow更多信息并让它执行更好的静态分析?

2 个答案:

答案 0 :(得分:5)

对于类的特定情况,这两个示例都可以。关键是它会像这样崩溃:

  • import type ... from导入流式
  • import ... from导入标准JS值以及该值的类型。

JS类生成一个值,但Flowtype也将类声明解释为类型声明,因此都是

那么import type在哪里重要?

  1. 如果您导入的内容没有值,则在某些情况下使用值导入会被解释为错误,因为大多数JS工具都不知道Flow存在。
      例如,
    • export type Foo = { prop: number };仅对import type { Foo } from ...很重要,因为没有名为Foo
  2. 如果您导入的内容具有JS值,但您想要的只是类型
    • 仅导入类型可以使代码更具可读性,因为从导入中可以清楚地看到只使用了类型,因此文件中没有任何内容可以创建该类的新实例。
    • 有时只导入该类型将允许您避免文件中的依赖循环。根据代码的编写方式,有时候输入内容的顺序很重要。由于import type ...仅影响类型检查,而不影响运行时行为,因此可以导入类型而不需要实际执行导入的文件,从而避免潜在的循环

答案 1 :(得分:3)

如此link

所述
  

使用导入类型,您希望导入类的类型,而不是类本身。

以下相同链接给出的示例

// @flow

// Post-transformation lint error: Unused variable 'URI'
import URI from "URI";

// But if you delete the require you get a Flow error:
// identifier URI - Unknown global name
module.exports = function(x: URI): URI {
  return x;
}

由于我们已将URI导入此组件,linter将检查我们是否在此组件中使用了该类。但是,我们只将它用作流类型检查,因此linter会抛出错误,说我们导入了未使用的变量。