Typescript: обновление одного свойства класса автоматически приводит к обновлению другого

#typescript

#typescript

Вопрос:

Я искал это, и мне трудно найти где-либо, что объясняет, как это сделать..

У меня есть класс:

 export class CalendarLayout {
   private displayedColumns: number;
   private displayedHours: number;
   private calendarStartDatePosition: moment.Moment;
   private dayDifference: number;


   constructor(
            displayedColumns: number,
            displayedHours: number,
            calendarStartDatePosition: moment.Moment,
            dayDifference: number
           ) {
    this.displayedColumns = displayedColumns;
    this.displayedHours = displayedHours;
    this.calendarStartDatePosition = calendarStartDatePosition;
    this.dayDifference = dayDifference;
}
  

}

На самом деле я хотел, чтобы dayDifference было вычисляемым значением на основе calendarStartDatePosition.

 dayDifference = this.calendarStartDatePosition.diff(moment(), 'days');
  

Я пытался использовать геттеры и сеттеры безрезультатно. Кроме того, компилятор пожаловался, что он не получает значение для dayDifference ..

Как у вас есть свойство класса, в моем случае «dayDifference», которое само по себе вычисляется из одного из других свойств? Кроме того, если я обновляю свойство calendarStartDatePosition, свойство dayDifference автоматически обновляется.

Комментарии:

1. Вы хотите определить средство получения, судя по его звукам.

2. Не уверен, как вы это делаете правильно

3. get dayDifference() { /* code that calculates value */ } Достаточно было бы чего-то вроде.

4. Просто определите средство получения (как я ссылался). Это свойство.

5. В качестве дополнительного примечания, учитывая, что это не относится к TypeScript, здесь могло бы хватить тега JavaScript.

Ответ №1:

Я вставил комментарии в предоставленный вами код:

 export class CalendarLayout {
    private displayedColumns: number;
    private displayedHours: number;
    private calendarStartDatePosition: moment.Moment;
    // private dayDifference: number;

    // We can define a getter (private as before).
    // This will *automatically* calculate the relevant value
    // when asked (via `this.dayDifference`, no method call).
    private get dayDifference() {
        return this.calendarStartDatePosition.diff(moment(), 'days');
    }

    constructor(
        displayedColumns: number,
        displayedHours: number,
        calendarStartDatePosition: moment.Moment,
        // dayDifference: number // Calculated automatically
    ) {
        this.displayedColumns = displayedColumns;
        this.displayedHours = displayedHours;
        this.calendarStartDatePosition = calendarStartDatePosition;

        // We no longer need to set this, as we're calculating it as needed.
        // this.dayDifference = dayDifference;
    }
}
  

Я не знаком с Moment.js , но вам может понадобиться глобальный объект, из которого вы можете получить текущее время; Я полагаю, что текущий код создает новый экземпляр при каждом вызове.