繁体   English   中英

在TypeScript .d.ts文件中,“导出为名称空间”是什么意思?

[英]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 parseexport声明时,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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM