角度6:在注入任何服务时使用访问修饰符

spa*_*610 4 typescript angular angular6

在阅读本教程时,我遇到了一个奇怪的情况。

在您将服务注入组件中时,如果错过了访问修饰符,则会出现以下错误,但将其添加为私有或公共运行会很好。

如果错过了访问修饰符,我们在Angular中没有任何默认范围吗?

export class UserDetailsComponent implements OnInit {

  name="";
  lastName="";
  constructor(userService : UserServiceService) { }

  ngOnInit() {
  }

  save(){
    this.userService.saveUser();

  }

}
Run Code Online (Sandbox Code Playgroud)

类型'UserDetailsComponent'上不存在属性'userService'。

Rob*_*sen 5

如果您前缀的构造函数的参数有访问修饰符(privateprotectedpublic),或者readonly,它会自动被“提升”是在打字稿一个类属性。此构造称为构造函数参数属性

没有前缀,构造函数参数仅是方法参数,您必须从构造函数本身将其手动分配给已声明的类属性。

手册中

通过在构造函数参数前添加可访问性修饰符或readonly或同时使用两者来声明参数属性。使用private 的参数属性声明并初始化一个私有成员; 同样,这同样适用于做publicprotectedreadonly


Har*_*uez 5

已经提供的所有答案都非常清楚并且有很好的信息。因此,简单来说,这是发生的事情:

你的构造函数是一个函数。在任何编程语言(到目前为止我遇到过)中,函数的参数只存在于函数本身的范围内。因此,在构造函数中传递的参数在整个类中不可用,除非将其值显式分配给类成员(如 Samuel J Matthew 提供的第二段代码所示。

参数中的访问修饰符的作用是指示 Angular 使用提供的访问修饰符创建与参数同名的类成员,并将其初始化为参数类型的实例。换句话说,参数成为类成员/属性。正如已经说过的,这被称为参数属性,这是一个非常合适的名称。

Ken 提供的文档非常有帮助。绝对值得一读。


Ken*_*Ken 1

Typescript 为您提供了依赖注入常见模式的快捷方式。

\n\n

您可以将其放入构造函数中:

\n\n
  this.userService = userService\n
Run Code Online (Sandbox Code Playgroud)\n\n

并创建一个属性声明:

\n\n
  userService: UserService;\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者,您可以将 \xe2\x80\x98public\xe2\x80\x99 放在 ctor 函数参数上,Typescript 会为您完成所有这些工作。对于 \xe2\x80\x98private\xe2\x80\x99 也是如此。但如果尝试在模板中使用私有属性,AOT 可能会失败。

\n\n

更多信息

\n