Почему нельзя обратиться через точку к свойству объекта?

286
27 октября 2017, 14:40

У меня есть сервис, который возвращает объект с датами:

@Injectable()
export class DateService {
  constructor() { }
  getNowDate(): Object {
    let d = new Date();
    d.setHours(d.getHours() + 3);
    let dateHuman = d.toISOString();
    let unixTimeStamp = Math.floor(d.getTime() / 1000) - (60 * 60 * 3);     
    return {
        dateHuman: dateHuman,
        unixTimeStamp: unixTimeStamp
    };
  };
}

Я его использую в компоненте так:

import { DateService } from '../services/date.service';
@Component({
  selector: 'app-question',
  templateUrl: './question.component.html',
  styleUrls: ['./question.component.scss']
})
export class QuestionComponent implements OnInit {
  constructor(private dateService: DateService) { }
  ngOnInit() {
    console.log(this.dateService.getNowDate()['dateHuman']);
  }
}

Всё ок - дата выводится. Но если я пытаюсь выводить дату так:

  ngOnInit() {
    console.log(this.dateService.getNowDate().dateHuman);
  }

То получаю следующую ошибку:

Property 'dateHuman' does not exist on type 'Object'.

Объясните пожалуйста в чём причина этого явления, почему в данном случае обращение к свойству через точку и через скобку не равноценны?

Answer 1

Проблема в проверке компилятором:

при обращении через точку, компилятор проверяет, есть ли указанное свойство в типе или нет

при обращении через скобки - не проверяет.

В примере в вопросе: метод getNowDate возвращает объект типа Object, в этом типе нет свойства dateHuman, поэтому при проверке компилятор выбрасывает указанную ошибку.

Answer 2

Проблема - вот в этой строчке:

getNowDate(): Object

Здесь вы объявляете, что метод getNowDate возвращает Object - а у типа Object нет свойства dateHuman.

Уберите явное указание типа возвращаемого значения у метода чтобы позволить компилятору самому вывести его из оператора return.

Альтернативный вариант - объявите интерфейс, который будет возвращать ваш метод:

interface IDateInfo {
    dateHuman: string;
    unixTimeStamp: number;
}
getNowDate(): IDateInfo
READ ALSO
Объясните, пожалуйста, про Array.prototype.filter.call()

Объясните, пожалуйста, про Array.prototype.filter.call()

Есть такой кусочек кода, который отстортировывает все div'ыМне непонятно:

346
Поправить выпадающий список

Поправить выпадающий список

нужно что бы когда я начинаю вводить в поле город - в подсказке всплывали не все, а только начинающиеся на введенную букву

285
extjs 5.1 возврат данных success в формате JSON

extjs 5.1 возврат данных success в формате JSON

Всем доброго времени сутокПодскажите пожалуйста как решить следующую задачу

255