在Typescript中导入模块的正确方法是什么?

时间:2016-09-24 01:06:01

标签: typescript

阅读official document about Typescript module时我有点困惑。

declare function require(moduleName: string): any;
// why declare require?
import { ZipCodeValidator as Zip } from "./ZipCodeValidator";
// Zip is being imported here, right? 
if (needZipValidation) {
    let ZipCodeValidator: typeof Zip = require("./ZipCodeValidator");
    // Zip is already imported before if statement, why import again? 
    let validator = new ZipCodeValidator();
    if (validator.isAcceptable("...")) { /* ... */ }
}

问题1:

import { ZipCodeValidator as Zip } from "./ZipCodeValidator";

在上面这行代码之后,ZipCodeValidator已经加载,并在当前文件的模块中以Zip形式提供。为什么稍后在if条件下再次在下面的代码行加载它?

let ZipCodeValidator: typeof Zip = require("./ZipCodeValidator");

注意:他们使用不同的方法加载相同的模块,一个是导入,另一个是require。为什么使用不同的方式?

问题2:

为什么需要声明require函数签名?申报是做什么的?如果声明,实施在哪里?

1 个答案:

答案 0 :(得分:1)

您要展示的示例是实现导入模块的特定方式。这显示了如何有条件地导入模块。这是一个特殊情况,我认为你不需要一直这么做。

所以,具体回答你的问题,

  1. 执行此操作后:import { ZipCodeValidator as Zip } from "./ZipCodeValidator"; TS编译器足够聪明,知道如果Zip仅用于类型位置,则不应加载模块。第二个require语句是实际导入的位置。

  2. 需要declare语句来确保TS知道特殊的require关键字。如果您使用node.js的typings库,则不需要显式执行此操作。