В Документация машинописного текста по интерфейсам в разделе «Типы классов» приведен следующий пример:
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». Как вы думаете, это был бы лучший вопрос?
Конечно, тогда я бы сказал, что когда Typescript переносится обратно в JavaScript, записываются функции конструктора JavaScript. Ключевое слово класса JavaScript даже не используется. Если бы это было так, транспилированный JavaScript должен был бы выглядеть точно так же, как примеры из MDN. Значение: в транспилированном Typescript переменная currentTime
обязательно установлена в конструкторе.
TypeScript обычно предлагает пытается поддержать ECMAScript на этапе 3 или выше. Инициализация поля класса является частью одно такое предложение, который, вероятно, когда-нибудь попадет в ES20XX. Так что есть надежда, что в конечном итоге это будет правильный синтаксис JavaScript (минус аннотации типов).
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, но он великолепен, как только вы к нему привыкнете.
Синтаксис машинописного текста !== Синтаксис JavaScript. Так что сравнение документации точно запутает.