为什么会显示错误?

时间:2018-01-09 15:52:59

标签: javascript angular typescript

我在打字稿中读到了这个:

constructor(private <variableName> : Type){}

相同
constructor(<variableName> : Type){
  <variableName> = <variableName>;
}

然后,为什么在下面的代码中我收到错误

import { Component, OnInit } from '@angular/core';
import { WeatherItem } from '../weather-item';
import { WEATHER_ITEMS } from '../weather.data';
import { WeatherService } from '../weather.service';

@Component({
  selector: 'app-weather-list',
  templateUrl: './weather-list.component.html',
  styleUrls: ['./weather-list.component.css']
})
export class WeatherListComponent implements OnInit {

   weatherItems : WeatherItem[];

   constructor(_weatherService : WeatherService) {
      _weatherService = _weatherService;
   }

    ngOnInit() {    
       this.weatherItems = this._weatherService.getWeatherItems();
    }
   }

这里,在ngOnInit方法中,我收到错误'属性_weatherService在类型WeatherListComponent'上不存在。 Code shows error

同时,以下代码可以成功运行。

import { Component, OnInit } from '@angular/core';
import { WeatherItem } from '../weather-item';
import { WEATHER_ITEMS } from '../weather.data';
import { WeatherService } from '../weather.service';

@Component({
  selector: 'app-weather-list',
  templateUrl: './weather-list.component.html',
  styleUrls: ['./weather-list.component.css']
})
export class WeatherListComponent implements OnInit {

  weatherItems : WeatherItem[];

  constructor(private  _weatherService : WeatherService) {}

  ngOnInit() {      
    this.weatherItems = this._weatherService.getWeatherItems();
  }

}

code runs correctly

**我尝试在构造函数中使用'this'关键字:

constructor( _weatherService : WeatherService) {
    this._weatherService = _weatherService;
  }

但是现在我在构造函数本身中遇到错误:'属性_weatherService在类型WeatherListComponent'Please check the error screenshot 上不存在

4 个答案:

答案 0 :(得分:3)

在这种情况下:

constructor(_weatherService : WeatherService) {
      _weatherService = _weatherService;
   }

在构造函数范围内,_weatherService引用传递给它的参数引用类成员 。因此,您基本上将_weatherService的值设置为自身。

现在,如果您执行以下操作:

constructor(_weatherService : WeatherService) {
   this._weatherService = _weatherService;
}

编译器正确地抱怨,因为你还没有定义一个名为_weatherService类成员

您可以通过执行以下操作来解决此问题:

_weatherService: WeatherService; // defaults to public visibility
constructor(_weatherService : WeatherService) {
    this._weatherService = _weatherService;
}

正如你所说的那样,typescript提供parameter properties,这只是一些语法糖,以避免繁琐的值初始化。

考虑到这一点,我们可以检查一些其他有趣的案例:

constructor(private _weatherService : WeatherService) {
    this._weatherService = _weatherService;
}

这将设置类成员_weatherService的值两次:一次通过ts功能,一次由于手动初始化。

weatherItems : WeatherItem[];
constructor(_weatherService : WeatherService) {
    this.weatherItems = _weatherService;
}

这将设置类成员weatherItems,但不会定义名为_weatherService的类成员。基本上,您可以注入一个参数,从中提取一个值并将其存储在类成员中,而不必在该类中存储对该参数的引用。

答案 1 :(得分:2)

在构造函数中,您需要将它添加到构造函数中引用的WeatherListComponent this

constructor(_weatherService : WeatherService) {
  this._weatherService = _weatherService;
}

答案 2 :(得分:1)

在构造函数中,当您尝试分配注入的服务时,_weatherService尚未实例化或声明)您尚未创建变量_weatherService。

 public _weatherService: WeatherService = new WeatherService();


 constructor(_weatherService : WeatherService) {
  this._weatherService = _weatherService;

}

答案 3 :(得分:1)

constructor(private <variableName> : Type){}

相当于

private <variableName>: Type;
constructor(<variableName> : Type){
    this.<variableName> = <variableName>;
}

您可以在游乐场here中看到一个有效的例子。