阅读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函数签名?申报是做什么的?如果声明,实施在哪里?
答案 0 :(得分:1)
您要展示的示例是实现导入模块的特定方式。这显示了如何有条件地导入模块。这是一个特殊情况,我认为你不需要一直这么做。
所以,具体回答你的问题,
执行此操作后:import { ZipCodeValidator as Zip } from "./ZipCodeValidator";
TS编译器足够聪明,知道如果Zip仅用于类型位置,则不应加载模块。第二个require语句是实际导入的位置。
需要declare
语句来确保TS知道特殊的require
关键字。如果您使用node.js的typings库,则不需要显式执行此操作。