【问题标题】:DefinitelyTyped: What does 'export = _;' means绝对类型:'export = _;' 是什么意思方法
【发布时间】:2016-11-07 07:47:59
【问题描述】:

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

我使用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'.

我不知道我做错了什么

【问题讨论】:

  • 试试普通的import 'angular-material';。说明:您实际上并不需要 ES2015/TS 模块中的任何内容;你只是想运行它的副作用,将 ngMaterial Angular 模块放入 Angular DI 命名空间。
  • 这样做,然后您还可以使用例如import IBottomSheetService = angular.material.IBottomSheetService; 导入定义的单个元素
  • 谢谢,也许我遗漏了一些东西,但我怎样才能在 html 模板中使用 md-toolbar 之类的东西。使用您的普通导入,我没有收到错误,但它也不起作用。

标签: angularjs typescript typescript1.8 definitelytyped


【解决方案1】:

当通过 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 模块的文件(实际上与我的示例中的代码类型相同)。从模块中导出的唯一内容是名称。

【讨论】:

  • 好的,你的意思是 angular-material 没有正确定义它的模块?
  • @michael_bitard:有点——它基本上是一个解决方案,因为 Angular 1 的设计并没有真正考虑到 ES6/TypeScript(因此他们有自己的模块系统)。当您导入 Angular 1 模块时,幕后(通常)发生的事情是他们在全局 angular 对象上调用 angular.module("moduleName, []) 来设置自己。
  • 好的,谢谢,所以当我需要在模板中使用角度材料时,我需要在控制器中添加viewProviders: ['ngMaterial']
  • @michael_bitard:据我所知,您所要做的就是导入 ngMaterial,然后将其添加到 Angular 应用程序的依赖项中 (angular.module("myApp", [ ngMaterial ]))。至少the getting started guide 中没有显示任何其他步骤。
  • @michael_bitard:虽然我不知道你使用ng-metadata时的等效语法是什么...
猜你喜欢
  • 2019-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 2020-12-04
  • 1970-01-01
相关资源
最近更新 更多