DefinitelyTyped:'export = _;' 是什么意思

DefinitelyTyped: What does 'export = _;' means

我正在尝试将 angular-material 与 ng-metadata 项目一起使用,但我 运行 遇到了一些问题。

我对 angular material 使用 DefinitelyTyped,第一行是:

declare module 'angular-material' {
  var _: string;
  export = _;
}

在我的 main.ts 我尝试 import { ngMaterial } from 'angular-material';

然后 bootstrap( AppComponent, [ 'ngMaterial' ] ); 但我得到的只是:

Error:(3, 10) TS2305: Module ''angular-material'' has no exported member 'ngMaterial'.

我不知道我做错了什么

当通过 ES6 或 TypeScript 使用时,Angular 模块遵循的一个常见模式是它们将使用自己的名称作为默认导出。例如,我的应用程序中的模块之一如下所示:

const session = angular.module("smSession", [])
    .service("session", SessionService)
    .component("smLogin", Login)
    .config(routes)
    .run(loginRedirect);

export default session.name;

这背后的原因是它使声明 Angular 模块的依赖项的语法更清晰;例如:

import angular from "angular";
import ngAnimate from "angular-animate";
import ngMaterial from "angular-material";
import uiRouter from "angular-ui-router";

let module = angular.module("myApp", [ ngAnimate, ngMaterial, uiRouter ]);

如果他们改为导出整个模块,则您必须这样做:

let module = angular.module("myApp", [ ngAnimate.name, ngMaterial.name, uiRouter.name ]);

所以这就是为什么 angular-material 的主模块声明看起来像这样的原因 - 它们只是表示这样一个事实,即您可以从包中导入的只是一个表示模块名称的字符串。其余的类型定义是 - 您可以在应用程序的任何地方使用 angular.material 命名空间,而无需进行导入。

编辑:澄清一下,这里是 the file that gets imported when you import ngMaterial 的实际来源:

// Should already be required, here for clarity
require('angular');

// Load Angular and dependent libs
require('angular-animate');
require('angular-aria');

// Now load Angular Material
require('./angular-material');

// Export namespace
module.exports = 'ngMaterial';

请注意 require('./angular-material') 没有 return 任何东西 - 有效导入只是运行在幕后设置 Angular 模块的文件(实际上与在我的例子中)。唯一从模块中导出的是名称。