DefinitelyTyped:' export = _;'手段

时间:2016-07-05 12:53:37

标签: angularjs typescript typescript1.8 definitelytyped

我尝试在角元素项目中使用ng-metadata项目,但我遇到了一些问题。

我对角度材质使用DefinitelyTyped,第一行是:

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

在我的主题中,我尝试import { ngMaterial } from 'angular-material';

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

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

我不知道自己做错了什么

1 个答案:

答案 0 :(得分:2)

当通过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的主模块声明看起来如此 - 它们只是表示从包中导入的所有内容都是表示模块名称的一个字符串。其余的类型定义是ambient - 您可以在应用程序的任何位置使用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')没有返回任何内容 - 导入有效地只运行在幕后设置Angular模块的文件(实际上是与我的示例中相同的代码)。从模块中导出的唯一内容是名称。