如何将TypeScript类集中导入Angular模块?

时间:2017-08-26 04:31:52

标签: angular typescript

是否有推荐的方法将TypeScript类导入Angular模块,以便该模块中的每个组件或服务都继承这些定义?

核心问题是“为什么导入模块的类不会自动导入到该模块中的其他组件中?”

我已尝试将类导入模块,如下所示:

registration.model.ts:

export class Event {
  id: string;
  name: string;
}

registration.module.ts:

import { Event } from './registration.model';

我还将它添加到模块中的声明中没有任何效果(我发现它什么也没做的时候我从声明数组中删除了它):

declarations: [
    Event,
    ...
]

registration.service.ts:

getEvents(): Observable<Event[]> {

  return this.http.get(`api/events`)
    .map(response => response.json());

}

产生此错误,应用程序无法编译:

  

错误   C:/code/registration/src/app/registration/registration.service.ts   (26,29):找不到名字'事件'。

如果我将导入直接添加到registration.service.ts中,那么错误就会消失,所有内容都会正确编译:

import { Event } from './registration.model';

我已经验证模块中的相对路径是否正确。我可以将它更改为模块中的绝对路径,并且我将在服务中得到相同的错误。

跟进编辑 感谢Adrian的回复,我现在明白了这一点。我还发现您可以从TypeScript模块一次导入多个类,如下所示:

import * as Registration from 'app/models/registration.model'; 

2 个答案:

答案 0 :(得分:1)

这不是它的工作原理。要在应用程序的其他部分中使用Event模型类,您需要在每个部分中导入它。如果您使用或不使用NgModule,则无关紧要。

Angular compiler使用NgModule,但在进入该步骤之前,TypeScript编译器需要处理您的代码。

在您要使用它的每个文件中,您需要导入它,就像您在模块中所做的那样(可能在每种情况下路径可能不同):

import { Event } from './registration.model';

否则TypeScript将不知道什么是Event以及从哪里获取它。

答案 1 :(得分:0)

  

错误本身表示无法找到名称Event

问题在于您的相对路径。相对路径不正确

<小时/> 供参考:

不要在 Event class 中提及 declarations metadata property 。当一个类必须使用 declaration array 执行某些操作时,您应该在 Angular context 中提及一些内容的 @Component decorator 即可。

由于您使用纯的Typescript类,只需在 Event

中导入 registration.service.ts

<强> registration.service.ts

import { Event } from './registration.model or correct relative path';

getEvents(): Observable<Event[]> {   // Now Event[] is declared and will not issue any error.

  return this.http.get(`api/events`)
    .map(response => response.json());

}