Typescript 角度依赖注入-为什么需要导入?

Typescript 角度依赖注入-为什么需要导入?,typescript,Typescript,在下面的代码示例中,app.module设置用于角度依赖项注入的提供程序。因此,具有对DataService类的引用 // app.module.ts import { DataService } from './services/dataService'; import { LocationsComponent } from './components/locations.component'; @NgModule({ declarations: [ AppComponent,

在下面的代码示例中,app.module设置用于角度依赖项注入的提供程序。因此,具有对DataService类的引用

// app.module.ts 
import { DataService } from './services/dataService';
import { LocationsComponent } from './components/locations.component';
@NgModule({
  declarations: [
    AppComponent,
    LocationsComponent,
  ],
  imports: [
    BrowserModule,
    HttpClientModule,
  ],
  providers: [
    DataService
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }
我的理解是,在locations.component中,将执行DI以在构造函数中创建DataService类的新实例。我不明白的是为什么组件中需要导入{DataService}?为什么Angular在看到构造函数中指定的DataService类型时不能向构造函数提供此DataService实例,因为Angular从app.module知道在哪里可以找到DataService类?locations.component中的导入{DataService}似乎是多余的

// locations.component.ts
import { DataService } from '../../../services/dataService';
@Component({
  selector: 'app-locations',
  templateUrl: './locations.component.html'
})
export class LocationsComponent {
  data: any[] = [];
  constructor(private dataService: DataService) { 
      this.data = dataService.load();
  }
}

我想我理解你的问题。这不是为什么需要进口,而是:

为什么必须指定相同的导入2x,一次在使用点(组件),一次在模块声明中

从技术上讲,您根本不必在模块中指定服务的导入。
@Component
属性可以采用选项
providers
值,您可以指定组件的依赖项。如果这样做,则不必在模块中将相同的服务声明为模块中的依赖项

import { DataService } from '../../../services/dataService';
@Component({
  selector: 'app-locations',
  templateUrl: './locations.component.html',
  providers: [DataService],

})
export class LocationsComponent {
  data: any[] = [];
  constructor(private dataService: DataService) { 
      this.data = dataService.load();
  }
}

在模块中指定它的原因是在模块中使用角度依赖注入框架注册服务。否则,每次要注入相同的类型时,都必须执行上述操作(在组件级别注册)。通过在模块级别注册该类型,它还将注入相同的服务实例,有效地创建一个类似于单例的模式。

如果不导入它,您希望如何使用它?我认为这与Angular完全无关。如果您试图引用文件中任何地方或全局未定义的类,TypeScript将无法编译。我想我理解您的问题。这不是为什么需要导入,而是:为什么必须指定相同的导入2x,一次在使用点(组件),一次在模块声明中。是的,Igor。对象的引用可从app.module中的导入获得,该导入首先运行。为什么不能自动将此引用传递给组件并将实例提供给构造函数?导入不是由angular使用的,而是由typescript编译器使用的。编译器对组件和注入一无所知,但它想知道,当你在一个文件中提到一个类名时,该类的定义就存在于其中,这样它就可以加载它并检查语法错误等。从编译器的角度来看,假设locations.component.ts与app.module.ts意味着相同的数据服务也是错误的。实际上,您在模块中指定它以将其注册为一个单例,因此对它的每个引用都是对答案Igor的相同引用。Zapl上面的评论是我不理解的:typescript和angular角色之间的区别。