[英]What does `export as namespace` mean in a TypeScript .d.ts file?
我一直在阅读有关DefinitelyTyped的一些声明文件,并且经常遇到如下文件:
declare function domready(callback: () => any) : void;
export = domready;
export as namespace domready;
我了解前两行-声明一个函数并将该函数导出为模块对象。 但是最后一行是什么? 我的申报文件中需要吗? 它有什么作用?
这是UMD模块声明 。
如果您还不熟悉,那么UMD是一种创建模式,它允许将同一JavaScript库用作全局变量 (可以在任何地方访问的一个)或用作模块 (在运行时专门加载的模块),具体取决于环境。
许多库都是使用UMD模式编写的。 例如,您可以写
moment.parse("12-31-2017")
在浏览器中,但是在node.js中编写如下代码:
const m = require("moment");
m.parse("12-31-2017")
当您编写类似于export function parse
的export
声明时,TypeScript知道您正在像第二段代码中那样描述模块 。 但是,如果您正在为其编写.d.ts文件的库也创建了全局变量,则可以使用UMD模块声明语法来描述该全局变量:
export as namespace the_global_identifier;
一些UMD库将始终创建全局库,而如果将其他UMD库加载到存在模块系统的环境中,则必须将其导入。 在一般的库中,没有清楚地记录它们使用的行为,这意味着声明文件的作者并不真正知道该期待什么,这意味着TypeScript是保守的,并且仅当引用它的文件不是模块时才允许访问全局标识符。
如果您正在编写一个声明文件,并且不确定它们的库是否为UMD,请检查如下所示的模式:
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(factory((global.mymodule = global.mymodule || {})));
}(this, function (exports) { 'use strict';
function myFunction() {
console.log('hello world');
}
}));
这是有说服力的UMD气味:大量针对“导出”,“模块”和“定义”的typeof
检查,然后分配给赋予大型函数主体的“导出”参数。 如果您没有看到这个库中的代码,它几乎肯定不是一个UMD模块,你不应该写一个export as namespace
声明。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.