TypeScript基础入门之模块(三)

转载 TypeScript基础入门之模块(三)安全

可选模块加载和其余高级加载方案

在某些状况下,您可能只想在某些条件下加载模块。在TypeScript中,咱们能够使用下面显示的模式来实现此模式和其余高级加载方案,以直接调用模块加载器而不会丢失类型安全性。性能优化

编译器检测是否生成的JavaScript中使用了每一个模块。若是模块标识符仅用做类型注释的一部分而从不用做表达式,则不会为该模块生成require调用。这种未使用的引用的省略是一种良好的性能优化,而且还容许可选地加载这些模块。性能

该模式的核心思想是import id = require("...")语句使咱们可以访问模块公开的类型。
模块加载器是动态调用的(经过require),以下面的if块所示。
这利用了参考省略优化,所以模块仅在须要时加载。
为了使这个模式起做用,重要的是经过导入定义的符号仅用于类型位置(即从不在将被生成到JavaScript中的位置)。
为了保持类型安全,咱们能够使用typeof关键字。
typeof关键字在类型位置使用时会生成值的类型,在本例中为模块的类型。优化

**示例:Node.js里的动态模块加载**ui

declare function require(moduleName: string): any;

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

if (needZipValidation) {
    let ZipCodeValidator: typeof Zip = require("./ZipCodeValidator");
    let validator = new ZipCodeValidator();
    if (validator.isAcceptable("...")) { /* ... */ }
}

**示例:require.js里的动态模块加载**spa

declare function require(moduleNames: string[], onLoad: (...args: any[]) => void): void;

import * as Zip from "./ZipCodeValidator";

if (needZipValidation) {
    require(["./ZipCodeValidator"], (ZipCodeValidator: typeof Zip) => {
        let validator = new ZipCodeValidator.ZipCodeValidator();
        if (validator.isAcceptable("...")) { /* ... */ }
    });
}

**示例:System.js里的动态模块加载**code

declare const System: any;

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

if (needZipValidation) {
    System.import("./ZipCodeValidator").then((ZipCodeValidator: typeof Zip) => {
        var x = new ZipCodeValidator();
        if (x.isAcceptable("...")) { /* ... */ }
    });
}
相关文章
相关标签/搜索