typescript - 解释 TypeScript 中的 "export ="和 "export as namespace"语法

标签 typescript

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

export = React;
export as namespace React;

谷歌搜索,我发现对这个的引用被用来使声明文件在基于模块和非基于模块的系统中都可用。但是,我正在努力寻找一个明确的解释:

  1. 这些行中的每一行分别做什么
  2. 这种组合究竟如何支持这两种类型的消费者。

最佳答案

第一种形式用于 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;

测试.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 form 创建一个全局变量,因此无需导入即可使用,但您仍可以使用 import { name } from "some-library" 导入它进口形式。查看documentation这给出了这个例子:

数学库.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);

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

关于typescript - 解释 TypeScript 中的 "export ="和 "export as namespace"语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44847749/

相关文章:

reactjs - TypeScript 和 React-Three-Fiber (@react- Three/Fiber) 中无法识别 ThreeEvent 和 WheelEvent

使用全局注入(inject)器的 Angular 7 组件继承

javascript - Angular Highcharts hideNoData 不能动态工作

javascript - react 和 typescript : Convention for classes when no props are being passed

typescript - 省略似乎在扩展记录的类型上被破坏

javascript - 上传时显示预览图片

javascript - 在 Angular 中使用什么更好 - src 或 [src]

typescript - 使用 webpack 从 html 文件加载挖空模板

typescript - 推断传递的属性名称的值

typescript - 我们什么时候在 Angular 2 中使用提供者?