Здравствуй, дорогой друг. Сегодня я постараюсь сделать все возможное, чтобы прозвучавшая из чьих-то уст фраза: «Я пишу на TypeScript,» — не возводила человека, это произнесшего, в ранг богов.
Миф «TypeScript — это язык программирования»
JavaScript — это язык программирования, а TypeScript — это синтаксический сахар, который делает твою жизнь проще, когда ты пытаешься использовать лучшие ООП-практики при разработке на JS.
Миф «TypeScript надо изучать»
Чтобы написать класс в JS надо много чего изучить. И даже при наличии знаний, можно обосраться и написать лютую дичь.
Ближе к делу
namespace Xrm.oData { export class OrderColumn { constructor(init: any) { for (var prop in this) { if (this.hasOwnProperty(prop)) { this[prop] = init[prop]; } } } public column: string = ''; public order: Xrm.oData.OrderTypes = Xrm.oData.OrderTypes.Asc; } }
Ну и разберем его по кусочкам.
namespace Xrm.oData — вот так просто и легко объявляется пространство имен с помощью TS.
export class OrderColumn — вот так мы объявляем класс «OrderColumn». Ключевое слово «export» говорит, что класс доступен не только в пределах пространства имен (читай, публичный).
*Задача со звездочкой: найди объявление конструктора.
public column: string = »; — объявление публичного поля типа string.
Ну а теперь, давай посмотрим, что тебе пришлось бы написать на чистом JS, чтобы получить такой же результат:
var Xrm; (function (Xrm) { var oData; (function (oData) { var OrderColumn = (function () { function OrderColumn(init) { this.column = ''; this.order = Xrm.oData.OrderTypes.Asc; for (var prop in this) { if (this.hasOwnProperty(prop)) { this[prop] = init[prop]; } } } return OrderColumn; }()); oData.OrderColumn = OrderColumn; })(oData = Xrm.oData || (Xrm.oData = {})); })(Xrm || (Xrm = {}));
Не знаю как тебе, но мне от одного объявления пространства имен хочется плакать.
Если ты достаточно внимателен, то заметил, что с точки зрения функционального кода нет никаких отличий. Вообще. Все, что делает TypeScript — позволяет с одного взгляда понять публичный или приватный у тебя метод, какой тип у возвращаемых значений и свойств, а также, заставляет IDE ругаться и не компилировать себя в JS-файл, если ты допускаешь ошибку — например в интовую переменную пытаешься записать строку.
Зачем нужен TypeScript
Как я уже писал выше: это просто синтаксический сахар. Он не запретит тебе выстрелить в ногу из винтовки, но сделает все возможное, чтобы отсрочить этот момент. Используя TS ты делаешь код чище и читабельнее, что крайне важно на этапе поддержки проекта. Ты можешь использовать перечисления, интерфейсы, наследование и уровни доступа (public, private, protected), не гугля как делать это на чистом JS (спойлер: protected — никак).
Где скачать или почитать об этом божественном расширении?
Ну на сайте конечно же. В студию ставится как расширение и для своей работы требует минимум усилий: наличия config-файла, чтобы компилятор знал как перегонять ts-файлы в js.
О каких проблемах я должен знать?
TS-компилятор может объединить файлы, но он не занимается минификацией. Т.е. если два класса находятся в разных файлах, но в одном и том же пространстве имен, то они оба будут обернуты в лапшу из скобочек.
Нельзя C#-классы перегнать в TS-классы. Т.е. если у тебя есть код на сервере и тебе его нужно продублировать на клиенте, то это придется делать ручками.
Ну и не желательно часть проекта писать на чистом JS, а часть на TS. Чисто из эстетических соображений. Поэтому данный нюанс надо обговорить на старте проекта и писать на чем-то одном.