为什么在类的构造函数中声明的属性不存在?

时间:2019-11-01 04:36:50

标签: angular typescript

constructor (service: MyService) {}

ngOnInit() {
    this.service.init();
}

在上面的代码中,我得到:-

Property `service` does not exist on type 'MyComponment'

但是,如果我将service声明为private,则它可以工作。这是怎么回事?

-

[Angular 8.2.12,TypeScript 3.5.3]

3 个答案:

答案 0 :(得分:4)

来自docs

  

通过在构造函数参数前面声明参数属性   使用辅助功能修饰符或readonly,或同时使用两者。使用private   对于参数属性,声明并初始化一个私有成员;   同样,publicprotectedreadonly也是如此。

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

Related SO Post

答案 1 :(得分:0)

  

类型“ MyComponment”上不存在属性service

错误是因为您试图在类的构造函数之外访问service。而且根据设计,如果您愿意在构造函数之外使用某些变量/初始化,则必须使用一些访问修饰符,例如private public等。

   constructor (private service: MyService) {}
    ngOnInit() {
        this.service.init();  // valid
    }

这里

constructor (service: MyService) {}
ngOnInit() {
    this.service.init();  // Invalid
}

ngOnInit是类的外部/不同方法,而不是构造方法的内部方法,因此,要使用this关键字进行访问,必须在构造方法中初始化时使用一些访问修饰符前缀。

但是,如果您这样做,这将起作用-

constructor (service: MyService) {
    service.init();  // valid
}

用简单的话来说,您可以遵循这个小例子-

答案 2 :(得分:0)

我假设您是说像这样放置source ~/.profile

private

这实际上是TypeScript的简写。

类似于

constructor (private service: MyService) {}

它是糖,所以您不必做

constructor (public service: MyService) {}

相反,您会这样做:

class Foo {
  private foo
  public bar
  constructor (foo, bar) {
    this.foo = 1
    this.bar = 2
  }
}

将TypeScript编译为JS时,会将公共和私有都作为常规(公共)实例属性。因为JS实际上没有私有类成员(not yet anyway)的概念