2016-09-24 88 views
1

阅读official document about Typescript module时我有点困惑。在Typescript中导入模块的正确方法是什么?

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已经加载,并且可作为当前文件的模块中邮编。为什么后面的if条件在下面一行代码中再次加载?

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

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

问题2:

为什么你需要声明要求的函数签名?声明做什么?如果声明,实现在哪里?

回答

1

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

因此,要回答你的问题具体,

  1. 后你这样做:import { ZipCodeValidator as Zip } from "./ZipCodeValidator";的TS编译器是足够聪明,知道如果邮编是在类型位置仅使用,那么它应该不会加载该模块。第二个要求声明是实际导入的地方。

  2. 需要declare声明以确保TS知道特殊的require关键字。如果您为node.js使用类型库,则不需要明确地执行此操作。

相关问题