Задает ли Typescript свойства интерфейса в конструкторе классов?

В Документация машинописного текста по интерфейсам в разделе «Типы классов» приведен следующий пример:

interface ClockInterface {
    currentTime: Date;
}

class Clock implements ClockInterface {
    currentTime: Date = new Date();
    constructor(h: number, m: number) { }
}

Строка сразу после "class Clock...", начинающаяся с "currentTime:...", по-видимому, подразумевает, что если я сделаю var something = new Clock(), моя переменная something будет иметь атрибут currentTime, доступный для нее, то есть something.currentTime.

Меня это смущает из-за следующей строки из документация MDN по классам Javascript:

Instance properties must be defined inside of class methods

Пример, который они приводят:

class Rectangle {
  constructor(height, width) {    
    this.height = height;
    this.width = width;
  }
}

Подразумевается, что следующий код будет недействительным:

class Rectangle {
  height: 23, 
  width: 45,
  constructor(height, width) {    
  }
}

Моя путаница: пример кода в документации Typescript не назначает currentTime в конструкторе. Этот шаг отсутствует в их примере, или их синтаксис подразумевает, что «кстати, свойствам, определенным непосредственно в классе, волшебным образом присваивается значение в конструкторе?» Если это так, что произойдет, если вы установите заданное значение в конструкторе самостоятельно, «вручную»?

Синтаксис машинописного текста !== Синтаксис JavaScript. Так что сравнение документации точно запутает.

Randy Casburn 31.05.2019 00:01

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

Caleb Jay 31.05.2019 00:02

Конечно, тогда я бы сказал, что когда Typescript переносится обратно в JavaScript, записываются функции конструктора JavaScript. Ключевое слово класса JavaScript даже не используется. Если бы это было так, транспилированный JavaScript должен был бы выглядеть точно так же, как примеры из MDN. Значение: в транспилированном Typescript переменная currentTime обязательно установлена ​​в конструкторе.

Randy Casburn 31.05.2019 00:05

TypeScript обычно предлагает пытается поддержать ECMAScript на этапе 3 или выше. Инициализация поля класса является частью одно такое предложение, который, вероятно, когда-нибудь попадет в ES20XX. Так что есть надежда, что в конечном итоге это будет правильный синтаксис JavaScript (минус аннотации типов).

jcalz 31.05.2019 02:29
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
class Clock implements ClockInterface {
    currentTime: Date = new Date();
    constructor(h: number, m: number) { }
}

Запускается конструктор, а затем все свойства, которым назначены значения по умолчанию, подключаются, поэтому currentTime назначается после вызова конструктора.

Это позволяет использовать такой синтаксис, как

class MyClass {
  myProperty = this.myService.serviceProperty;

  constructor(private myService: Myservice) {}
}

Маркировка параметров конструктора как частного, защищенного или общедоступного автоматически назначает их как свойства класса, и вам не нужно делать

this.property = paramater

в конструкторе. Синтаксис TypeScript отличается от JavaScript, но он великолепен, как только вы к нему привыкнете.

Другие вопросы по теме