Предисловие 1
Глава 1 Инструменты TypeScript и параметры фреймворков 7
Что такое TypeScript? 9
JavaScript и ECMAScript 10
Преимущества TypeScript 11
Компиляция 11
Сильная типизация 12
Синтаксический сахар 13
Определение типов для популярных библиотек JavaScript 14
DefinitelyTyped 15
Инкапсуляция 15
Классы TypeScript генерируют замыкания 17
Методы доступа public и private 17
Интегрированные среды разработки TypeScript 19
Компиляция на основе Node 20
Создание файла tsconfig.json 21
Локализованные сообщения 22
Visual Studio Code 23
Установка VSCode 23
Изучение VSCode 23
Создание файла tasks.json 23
Сборка проекта 26
Создание файла launch.json 26
Установка точек останова 26
Отладка веб-страниц 27
Microsoft Visual Studio 30
Создание проекта в Visual Studio 30
Настройки проекта по умолчанию 32
Отладка в Visual Studio 35
WebStorm 36
Создание проекта в WebStorm 37
Файлы по умолчанию 37
Создание простого HTML-приложения 38
Запуск веб-страницы в Chrome 39
Другие редакторы 41
Использование --watch и Grunt 41
Резюме 44
Глава 2 Типы, переменные и методы функций 45
Базовые типы 46
Типизация в JavaScript 46
Типизация в TypeScript 47
Синтаксис типов 48
Типизация с поддержкой вывода типов 51
Оглавление
[ ii ]
Утиная типизация 52
Шаблонные строки 53
Массивы 54
for...in и for...of 55
Тип any 56
Явное приведение типов 57
Перечисления 58
Const enum 59
Строковые перечисления 60
Реализация перечислений 60
Const 62
Ключевое слово let 62
Определенное присваивание 65
Типы свойств с точечной нотацией 66
Числовые разделители 67
Функции 67
Типы возвращаемого значения 67
Анонимные функции 68
Необязательные параметры 69
Параметры по умолчанию 70
Оставшиеся параметры 71
Функции обратного вызова 73
Сигнатуры функций 75
Переопределение функций 77
Try…catch 78
Расширенные типы 79
Объединенные типы 80
Охранники типов 80
Псевдонимы типов 82
Null и undefined 83
Нулевые операнды 85
Never 86
Unknown 87
Object rest and spread 88
Приоритет распространения 89
Использование операторов остатка и распространения с массивами 90
Кортежи 91
Деконструкция кортежей 92
Необязательные элементы кортежа 93
Кортежи и синтаксис оператора остатка 93
Bigint 94
Резюме 98
Глава 3 Интерфейсы, классы и наследование 99
Интерфейсы 100
Необязательные свойства 101
Компиляция интерфейса 102
[ iii ]
Оглавление
Слабые типы 102
Вывод типов с помощью оператора in 103
Классы 104
Свойства класса 106
Реализация интерфейсов 106
Конструкторы классов 108
Функции класса 109
Определения функций интерфейса 112
Модификаторы класса 113
Модификаторы доступа конструктора 114
Свойство readonly 116
Методы доступа к свойствам класса 116
Статические функции 118
Статические свойства 118
Пространства имен 119
Наследование 120
Наследование интерфейса 121
Наследование классов 121
Ключевое слово super 122
Переопределение функции 123
Члены класса protected 124
Абстрактные классы 125
Замыкания JavaScript 128
instanceof 130
Использование интерфейсов, классов и наследования –
шаблон проектирования Factory 132
Бизнес-требования 132
Что делает шаблон проектирования Factory 132
Интерфейс IPerson 133
Класс Person 133
Классы специалистов 134
Класс Factory 135
Использование класса Factory 136
Резюме 137
Глава 4 Декораторы, обобщения и асинхронные функции 138
Декораторы 139
Синтаксис декораторов 140
Несколько декораторов 141
Фабрика декораторов 141
Параметры декораторов класса 142
Декораторы свойств 144
Декораторы статических свойств 145
Декораторы методов 146
Использование декораторов методов 147
Декораторы параметров 149
Оглавление
[ iv ]
Метаданные декораторов 150
Использование метаданных декораторов 152
Обобщения 153
Синтаксис обобщений 154
Создание экземпляра обобщенного класса 154
Использование типа T 156
Ограничение типа Т 158
Обобщенные интерфейсы 160
Создание новых объектов в обобщениях 161
Расширенные типы с обобщениями 163
Условные типы 164
Распределенные условные типы 167
Выведение условных типов 169
keyof 171
keyof с числом 172
Отображаемые типы 174
Partial, Readonly, Record и Pick 175
Асинхронное программирование 177
Промисы 177
Синтаксис промисов 179
Использование промисов 181
Механизм обратного вызова в сравнении с синтаксисом промиса 182
Возвращение значений из промисов 183
async и await 185
awaitError 186
Синтаксис промиса в сравнении с синтаксисом async await 187
awaitMessage 188
Резюме 189
Глава 5 Файлы объявлений и строгие опции компилятора 190
Глобальные переменные 191
Использование блоков кода JavaScript в HTML 193
Структурированные данные 194
Пишем свой файл объявлений 196
Ключевое слово module 198
Интерфейсы 200
Объединенные типы 202
Слияние модулей 203
Справочник синтаксиса объявлений 204
Переопределение функций 204
Синтаксис JavaScript 204
Синтаксис файла объявлений 205
Вложенные пространства имен 205
Синтаксис JavaScript 205
Синтаксис файла объявлений 205
Классы 205
[ v ]
Оглавление
Синтаксис JavaScript 205
Синтаксис файла объявлений 205
Пространства имен классов 206
Синтаксис JavaScript 206
Синтаксис файла объявлений 206
Перегрузки конструктора класса 206
Синтаксис JavaScript 206
Синтаксис файла объявлений 206
Свойства класса 206
Синтаксис JavaScript 207
Синтаксис файла объявлений 207
Функции класса 207
Синтаксис JavaScript 207
Синтаксис файла объявлений 207
Статические свойства и функции 207
Синтаксис JavaScript 207
Синтаксис файла объявлений 208
Глобальные функции 208
Синтаксис JavaScript 208
Синтаксис файла объявлений 208
Сигнатуры функций 208
Синтаксис JavaScript 208
Синтаксис файла объявлений 208
Необязательные свойства 208
Синтаксис JavaScript 209
Синтаксис файла объявлений 209
Слияние функций и модулей 209
Синтаксис JavaScript 209
Синтаксис файла объявлений 209
Строгие опции компилятора 209
noImplicitAny 210
strictNullChecks 211
strictPropertyInitialization 212
noUnusedLocals и noUnusedParameters 213
noImplicitReturns 214
noFallthroughCasesInSwitch 215
strictBindCallApply 216
Резюме 218
Глава 6 Сторонние библиотеки 219
Использование файлов определений 219
Использование NuGet 220
Использование диспетчера расширений NuGet 220
Установка файлов объявлений 222
Использование консоли диспетчера пакетов 223
Установка пакетов 223
Оглавление
[ vi ]
Поиск имен пакетов 223
Установка конкретной версии 224
Использование npm и @types 224
Использование сторонних библиотек 225
Выбор фреймворка JavaScript 226
Backbone 227
Использование наследования с Backbone 227
Использование интерфейсов 230
Использование синтаксиса обобщений 230
Использование ECMAScript 5 231
Совместимость Backbone с TypeScript 232
Angular 1 232
Классы Angular и $scope 234
Совместимость Angular 1 с TypeScript 236
Наследование – Angular 1 против Backbone 236
ExtJS 237
Создание классов в ExtJS 238
Использование приведения типов 239
Компилятор TypeScript специально для ExtJS 240
Резюме 241
Глава 7 Фреймворки, совместимые с TypeScript 242
Что такое MVC? 243
Модель 243
Представление 244
Контроллер 245
Резюмируя 246
Преимущества использования MVC 247
Пример приложения 247
Использование Backbone 249
Производительность визуализации 249
Настройка Backbone 251
Структура Backbone 251
Модели Backbone 252
Класс ItemView 255
Класс ItemCollectionView 257
Приложение Backbone 259
Формы 260
Резюмируя 264
Использование Aurelia 264
Настройка Aurelia 264
Контроллеры и модели Aurelia 265
Представления Aurelia 266
Начальная загрузка приложения 267
События 268
[ vii ]
Оглавление
Формы 269
Резюмируя 270
Angular 270
Установка Angular 270
Модели Angular 271
Представления Angular 272
События 274
Формы 275
Формы шаблонов 275
Ограничения форм шаблонов 277
Реактивные формы 277
Использование реактивных форм 278
Резюмируя 280
Использование React 281
Настройка React 281
Настройка webpack 283
ItemView 286
CollectionView 288
Начальная загрузка 291
Формы 293
Изменение состояния 294
Свойства состояния 295
Возможности TypeScript в React 298
Синтаксис оставшихся параметров 298
Свойства по умолчанию 299
Резюмируя 300
Сравнение производительности 300
Резюме 303
Глава 8 Разработка через тестирование 304
Разработка через тестирование 305
Модульные, интеграционные и приемочные тесты 307
Модульные тесты 307
Интеграционные тесты 307
Приемочные тесты 308
Фреймворки для модульного тестирования 308
Jasmine 309
Простой тест 310
Репортеры 313
Сопоставители 314
Запуск и завершение теста 316
Принудительные тесты 317
Пропуск тестов 318
Тесты, управляемые данными 319
Использование шпионов 322
Слежка за функциями обратного вызова 323
Оглавление
[ viii ]
Использование шпионов в качестве фальшивок 324
Асинхронное тестирование 325
Использование функции done() 327
Использование async awaitc 329
HTML-тесты 330
Фикстуры 332
События DOM 333
Библиотеки для модульного тестирования 334
Testem 334
Karma 336
Тестирование в режиме headless 338
Protractor 338
Selenium 339
Поиск элементов страницы 341
Использование непрерывной интеграции 342
Преимущества непрерывной интеграции 343
Выбор сервера сборки 344
Team Foundation Server 344
Jenkins 344
TeamCity 345
Отчеты об интеграционных тестах 345
Резюме 346
Глава 9 Тестирование фреймворков, совместимых с Typescript 348
Тестирование нашего приложения 348
Тестирование Backbone 349
Настройка теста 349
Тесты моделей 350
Тесты сложных моделей 353
Тесты визуализации 354
Тесты событий DOM 356
Тесты представления коллекции 357
Тесты формы 359
Резюмируя 361
Тестирование Aurelia 361
Настройка 361
Модульные тесты 362
Тесты визуализации 363
События DOM 367
Резюмируя 368
Тестирование Angular 368
Настройка 368
Тесты моделей 371
Тесты визуализации 372
Тесты форм 375
Резюмируя 377
[ ix ]
Оглавление
Тестирование с React 378
Несколько точек входа 378
Использование Jest 379
Тесты начального состояния 382
Элемент input 384
Отправка формы 385
Подводя итоги 387
Резюме 387
Глава 10 Модуляризация 389
Основы 390
Экспорт модулей 392
Импорт модулей 393
Переименование модулей 393
Экспорт по умолчанию 394
Экспорт переменных 395
Типы импорта 396
Асинхронное определение модуля 397
Компиляция 398
Установка модуля AMD 399
Настройка Require 400
Настройка браузера 401
Зависимости модуля AMD 402
Начальная загрузка Require 405
Исправление ошибок конфигурации 406
Неправильные зависимости 407
Ошибки 404 407
Загрузка модулей с помощью SystemJS 408
Установка SystemJS 408
Конфигурация браузера 408
Зависимости модулей 411
Начальная загрузка Jasmine 413
Использование Express с Node 414
Установка Express 414
Использование модулей с Express 416
Маршрутизация 417
Шаблонизаторы 419
Использование Handlebars 420
События POST 423
Перенаправление HTTP-запросов 427
Функции Lambda 429
Архитектура функции Lambda 429
Настройка AWS 431
Serverless 433
Настройка Serverless 434
Развертывание 435
Оглавление
[ x ]
Функции Lambda в TypeScript 438
Node-модули функции Lambda 440
Логирование 442
Тестирование REST 443
Резюме 446
Глава 11 Объектно-ориентированное программирование 447
Принципы объектно-ориентированного программирования 448
Программирование в соответствии с интерфейсом 448
Принципы SOLID 449
Единственная ответственность 449
Открытость/закрытость 449
Принцип подстановки Барбары Лисков 450
Разделение интерфейса 450
Инверсия зависимостей 450
Проектирование пользовательского интерфейса 450
Концептуальный дизайн 451
Настройка Angular 453
Использование Bootstrap и Font-Awesome 454
Создание боковой панели 455
Создание наложения 459
Координация переходов 461
Шаблон State 462
Интерфейс шаблона State 463
Конкретные состояния 464
Шаблон Mediator 465
Модульный код 466
Компонент Navbar 466
Компонент SideNav 468
Компонент RightScreen 469
Дочерние компоненты 472
Реализация интерфейса посредника 472
Класс Mediator 473
Использование Mediator 477
Реагирование на события DOM 478
Резюме 480
Глава 12 Внедрение зависимости 481
Отправка почты 482
Использование nodemailer 483
Использование локального SMTP-сервера 484
Служебный класс 484
Настройки конфигурации 487
Зависимость объектов 489
Service Location 489
Антишаблон Service Location 492
[ xi ]
Оглавление
Внедрение зависимости 492
Создание инжектора зависимостей 493
Разрешение интерфейса 493
Разрешение enum 493
Разрешение класса 494
Внедрение конструктора 497
Внедрение декораторов 498
Использование определения класса 499
Синтаксический анализ параметров конструктора 500
Поиск типов параметров 502
Внедрение свойств 502
Использование внедрения зависимости 503
Рекурсивное внедрение 504
Резюме 506
Глава 13 Создание приложений 507
Интеграция Node и Angular 508
Сервер Express 510
Конфигурация сервера 512
Ведение журнала сервера 513
Опыт взаимодействия 517
Использование Brackets 518
Использование Emmet 519
Создание панели входа 522
Аутентификация 524
Маршрутизация в Angular 525
Использование HTML-кода, предназначенного
для пользовательского интерфейса 528
Стражи аутентификации 529
Связывание формы входа 531
Использование HttpClient 533
Использование Observable 535
Использование JWT-токенов 539
Верификация токенов 542
Использование Observables в гневе – of, pipe и map 543
Внешняя аутентификация 547
Получение API-ключа Google 547
Настройка социального логина 549
Использование данных пользователя Google 550
Резюме 552
Глава 14 Переходим к практике 554
Приложение Board Sales 555
API на основе базы данных 556
Структура базы данных 557
Конечные точки API 559
Оглавление
[ xii ]
Параметризованные конечные точки API 563
Службы REST в Angular 566
Спецификация OpenAPI 569
Приложение BoardSales 570
Компонент BoardList 570
Визуализация данных REST 573
concatMap 576
forkJoin 581
Модульное тестирование Observables 584
Шаблон проектирования Domain Events 587
Вызов и использование событий предметной области 590
Фильтрация данных 594
Резюме 602
Указатель 603