Как лучше всего создавать объекты модели в Angular / TypeScript:
Следует ли использовать аннотацию типа с обозначением объекта (объекты - это простые экземпляры
Object
)? Например.let m: MyModel = { name: 'foo' }
Следует ли использовать оператор
new
(объекты являются экземплярами соответствующего прототипа)?Следует ли смешивать эти два подхода и использовать их ситуативно? (Например, простые объекты при получении ответа от
HttpClient
, ноnew MyModel('foobar')
для удобства создания экземпляров путем передачи свойств в качестве аргументов конструктора)
Предыстория этого вопроса
Я новичок в TypeScript и, как и многие другие разработчики, пришел из популярных объектно-ориентированных языков, таких как Java.
Я понял ключевую концепцию: аннотации типов в TypeScript не играют роли во время выполнения. Они важны для компилятора и для автоматического завершения вашего редактора. В основном это ECMAScript с добавлением проверок типов во время компиляции.
В то время я не знал этого и ожидал, что TypeScript будет чем-то вроде "Java на стороне клиента", я нашел этот отчет об ошибке Angular: https://github.com/angular/angular/issues/20770
Люди (которые не понимают концепцию типов TypeScript) жалуются на HttpClient
не преобразование возвращенного простого объекта в тип их класса модели. Другие люди защищают это поведение и указывают на то, что в JavaScript нет типов времени выполнения.
И здесь возникает моя проблема: на самом деле в JavaScript ЕСТЬ типы времени выполнения. Вы можете создавать экземпляры прототипов с помощью оператора new
и даже проверять их конструктор с помощью оператора instanceof
.
В TypeScript у вас есть два способа создания экземпляра:
1) Используйте обозначение объекта (как показано в руководстве по Angular а>):
hero: Hero = {
id: 1,
name: 'Windstorm'
};
2) Используйте new
-оператор:
hero: Hero = new Hero();
На данный момент я работаю над проектом, в котором смешаны эти два варианта. Т.е. объекты модели одного и того же типа являются экземплярами Object
в некоторых случаях и экземплярами Hero
в других случаях.
Я ожидаю, что это приведет к проблемам позже, потому что конструктор вызывается только в последнем случае.
Моя идея правила / лучшей практики заключалась в том, чтобы определить все экземпляры модели как простые объекты и использовать конструктор для служб, компонентов и т. Д., Которые создаются путем внедрения зависимостей. В результате я бы вообще не стал использовать оператор new
.
Однако я не уверен, что это хорошая идея, и не смог найти передовой практики рекомендации по этому поводу.
ИЗМЕНИТЬ
Важное примечание для близких избирателей: я не ищу здесь вашего личного мнения. Я скорее ищу какую-то официально задокументированную передовую практику Angular, поскольку я считаю, что это основное дизайнерское решение, которое должно быть принято с самого начала проекта, и эти подходы не должны смешиваться случайным образом без определенной причины. Возможно, ответ прост: «Нет официальной рекомендации, какое решение принимать».
undefined
, и вероятность исключения во время выполнения выше. - person fishbone   schedule 08.08.2018