代码之家  ›  专栏  ›  技术社区  ›  James Ko

是否有必要对Flow执行“导入类型”而不是“导入”?

  •  8
  • James Ko  · 技术社区  · 6 年前

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

    // SomeClass.js
    export default class SomeClass {}
    
    // SomeFile.js
    import type SomeClass from './SomeClass';
    

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

    2 回复  |  直到 6 年前
        1
  •  7
  •   loganfsmyth    6 年前

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

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

    JS类生成一个值,但FlowType也将类声明解释为类型声明,因此 二者都 .

    那么在哪里呢 import type 重要吗?

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

    如本条所述 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 将检查是否使用了此组件中的类。但是,我们只将它用作流类型检查,因此 小精灵 将引发一个错误,说明我们导入了未使用的变量。