在TypeScript中解释"export ="和"export as namespace"语法

Cha*_*ion 19 typescript

我试图利用DefinitelyTyped存储库中的类型声明文件.其中许多文件使用以下模式:

export = React;
export as namespace React;
Run Code Online (Sandbox Code Playgroud)

谷歌搜索,我发现这个引用用于制作一个可用于基于模块和非基于模块的系统的声明文件.但是,我正在努力找到一个明确的解释:(a)这些线路各自确切地做了什么,以及(b)这种组合究竟是如何工作来支持这两类消费者的.

Dun*_*can 17

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

请参阅提供此示例的文档:

ZipCodeValidator.ts

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

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" }`);
});
Run Code Online (Sandbox Code Playgroud)

export as namespace表单创建全局变量,所以它可以在不导入可以使用,但你仍可以与导入import { name } from "some-library"进口的形式.请参阅提供此示例的文档:

数学lib.d.ts

export const isPrime(x: number): boolean;
export as namespace mathLib;
Run Code Online (Sandbox Code Playgroud)

然后,该库可用作模块中的导入:

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

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

mathLib.isPrime(2);
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢邓肯。我在发布之前阅读了这两个样本。我仍然发现自己不确定“但您仍然可以使用‘import { name } from ‘some-library’‘形式导入”的含义。这个例子中的“name”是什么?具体来说,当 `export =` 和 `export as namespace` 一起使用时,`import from` 样式导入的含义是什么? (2认同)
  • @Duncan,如何扩展 mathLib 命名空间,同时将其保留在全局范围内(无模块扩充) (2认同)
  • @AlexandruC,不知道。将其作为单独的问题发布? (2认同)