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]
答案 0 :(得分:4)
来自docs:
通过在构造函数参数前面声明参数属性 使用辅助功能修饰符或
readonly
,或同时使用两者。使用private
对于参数属性,声明并初始化一个私有成员; 同样,public
,protected
和readonly
也是如此。
没有前缀,构造函数参数仅是方法参数,您必须从构造函数本身将其手动分配给已声明的类属性。
答案 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)的概念