解释" export ="和"导出为命名空间" TypeScript中的语法

时间:2017-06-30 13:32:08

标签: typescript

我正在尝试使用DefinitelyTyped存储库中的类型声明文件。其中许多文件使用以下模式:

export = React;
export as namespace React;

在谷歌上搜索,我发现对此的引用被用于制作可在基于模块和非基于模块的系统中使用的声明文件。但是,我很难找到一个明确的解释:(a)这些行中的每一行都是单独的,以及(b)这种组合究竟是如何起作用来支持这两类消费者的。

1 个答案:

答案 0 :(得分:11)

第一种形式用于CommonJS和AMD模块系统。您必须将export = Reactimport React = require('./React')

相匹配

请参阅以下示例的documentation

ZipCodeValidator.ts

let numberRegexp = /^[0-9]+$/;
class ZipCodeValidator {
    isAcceptable(s: string) {
        return s.length === 5 && numberRegexp.test(s);
    }
}
export = ZipCodeValidator;

Test.ts

import zip = require("./ZipCodeValidator");

// Some samples to try
let strings = ["Hello", "98052", "101"];

// Validators to use
let validator = new zip();

// Show whether each string passed each validator
strings.forEach(s => {
  console.log(`"${ s }" - ${ validator.isAcceptable(s) ? "matches" : "does not match" }`);
});

export as namespace表单创建一个全局变量,因此无需导入即可使用,但您仍可以使用import { name } from "some-library"形式导入它。请参阅提供此示例的documentation

数学lib.d.ts

export const isPrime(x: number): boolean;
export as namespace mathLib;

然后可以将库用作模块中的导入:

import { isPrime } from "math-lib";
isPrime(2);
mathLib.isPrime(2); // ERROR: can't use the global definition from inside a module

它也可以用作全局变量,但仅限于脚本内部。 (脚本是没有导入或导出的文件。)

mathLib.isPrime(2);

这里有一个通用类型库,它不知道正在使用哪个模块系统,所以它试图覆盖所有基础。