Немного о TypeScript

Здравствуй, дорогой друг. Сегодня я постараюсь сделать все возможное, чтобы прозвучавшая из чьих-то уст фраза: «Я пишу на 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. Чисто из эстетических соображений. Поэтому данный нюанс надо обговорить на старте проекта и писать на чем-то одном.