|
1 | | -# Lesson 29 |
| 1 | +--- |
| 2 | +title: Занятие 29 |
| 3 | +description: Различие между стандартами языка, инструменты транспиляции, проблемы типизации |
| 4 | +--- |
| 5 | + |
| 6 | +# OTUS |
| 7 | + |
| 8 | +## Javascript Basic |
| 9 | + |
| 10 | +<!--v--> |
| 11 | + |
| 12 | +### Вопросы? |
| 13 | + |
| 14 | +<!-- s --> |
| 15 | + |
| 16 | +## Различие между стандартами языка, инструменты транспиляции, проблемы типизации |
| 17 | + |
| 18 | +<!-- s --> |
| 19 | + |
| 20 | +### Различие между стандартами языка, инструменты транспиляции |
| 21 | + |
| 22 | +<!-- v --> |
| 23 | + |
| 24 | +Какая текущая версия языка ECMAScript? |
| 25 | + |
| 26 | +<!-- v --> |
| 27 | + |
| 28 | +Какие новые удобные вещи появились в сравнении с ES5 ? |
| 29 | + |
| 30 | +<!-- |
| 31 | +- классы |
| 32 | +- стрелочные функции |
| 33 | +- let/const |
| 34 | +- Symbol / bigint |
| 35 | + --> |
| 36 | + |
| 37 | +[1](https://medium.com/@dupski/what-major-new-features-were-in-each-javascript-version-what-version-should-i-target-25526c498687), [2](http://es6-features.org/), [3](https://github.com/lukehoban/es6features), [4](https://www.w3schools.com/js/js_versions.asp) |
| 38 | + |
| 39 | +<!-- v --> |
| 40 | + |
| 41 | +В каком году появилась версия Javascript следующая за ES5 ? |
| 42 | + |
| 43 | +<!-- v --> |
| 44 | + |
| 45 | +Какие инструменты позволяют использовать новые версии, в окружении, которое работает со старыми версиями языка? |
| 46 | + |
| 47 | +<!-- v --> |
| 48 | + |
| 49 | +В каком году появился Babel.js? |
| 50 | + |
| 51 | +<!-- Sep 2014 --> |
| 52 | + |
| 53 | +<!-- v --> |
| 54 | + |
| 55 | +До того, как язык начал развиваться, его пытались модернизировать или заменить другими языками ([которые бы транспилировались в Javascript](https://github.com/jashkenas/coffeescript/wiki/List-of-languages-that-compile-to-JS)) |
| 56 | + |
| 57 | +<!-- v --> |
| 58 | + |
| 59 | +Примерно там же (в 2012) появился язык [TypeScript](https://ru.wikipedia.org/wiki/TypeScript). |
| 60 | + |
| 61 | +Разработчиком языка TypeScript является Андерс Хейлсберг (англ. Anders Hejlsberg), создавший ранее Turbo Pascal, Delphi и C#. |
| 62 | + |
| 63 | +<!-- v --> |
| 64 | + |
| 65 | +Главное чем отличался TS: |
| 66 | + |
| 67 | +- был **надмножеством** Javascript |
| 68 | +- поддерживал классы |
| 69 | +- добавлял работу с типизацией |
| 70 | + |
| 71 | +<!-- v --> |
| 72 | + |
| 73 | +### Вопросы? |
| 74 | + |
| 75 | +<!-- s --> |
| 76 | + |
| 77 | +### Проблемы типизации |
| 78 | + |
| 79 | +<!-- v --> |
| 80 | + |
| 81 | +Виды типизации: |
| 82 | + |
| 83 | +- динамическая / статическая |
| 84 | +- слабая / сильная |
| 85 | +- неявная / явная |
| 86 | + |
| 87 | +Какая типизация в Javascript? |
| 88 | + |
| 89 | +<!-- v --> |
| 90 | + |
| 91 | +Большая часть проблем в разработке связанна с незначительными факторами: |
| 92 | + |
| 93 | +- опечатки _(неправильно назвали переменную или свойство)_ |
| 94 | +- невнимательность _(не передали параметр, или передали неправильный параметр)_ |
| 95 | +- потеря контекста _(не учли контекст вызова)_ |
| 96 | +- мелкие упущения _(не учли все места, которые затрагиваются изменениями)_ |
| 97 | + |
| 98 | +<!-- v --> |
| 99 | + |
| 100 | +Это характерно для всех языков, но особенности типизации дают для этого хорошую почву. |
| 101 | + |
| 102 | +<!-- v --> |
| 103 | + |
| 104 | +Изначальная идея TypeScript - добавить явное указание типов в код. Что должно значительно уменьшить число таких проблем (или сделать их обнаружение более быстрым, без запуска кода). |
| 105 | + |
| 106 | +<!-- v --> |
| 107 | + |
| 108 | +```ts |
| 109 | +function getCityMap(city) { |
| 110 | + return `https://map.com?q=${city}`; |
| 111 | +} |
| 112 | +``` |
| 113 | + |
| 114 | +Что с этим кодом может пойти не так? |
| 115 | + |
| 116 | +<!-- v --> |
| 117 | + |
| 118 | +```ts |
| 119 | +function getCityMap(city: string): string { |
| 120 | + return `https://map.com?q=${city}`; |
| 121 | +} |
| 122 | +``` |
| 123 | + |
| 124 | +<!-- v --> |
| 125 | + |
| 126 | +Помимо работы с стандартными типами для Javascript, TS позволял определить тип как класс / интерфейс / форму (shape). |
| 127 | + |
| 128 | +[Например](https://www.typescriptlang.org/play?#code/JYOwLgpgTgZghgYwgAgArQM4HsTIN4BQyxyIcAthAFzIZhSgDmA3AQL4EFgCeADigGVycKGHRRsuALz4iJMpRp0GIFnOLAAjjRABXcgCNorDgQQ46yA1gM0hIsZhzIZhEqQrVkAcgBCN7wAadWQtGgB2AA52VjMLMCsbcUkaZOcZawNmIA) описать свойства и их тип, что было полезно для языка, где классами пользоваться еще не привыкли, а вот объекты были в ходу уже давно. |
| 129 | + |
| 130 | +<!-- v --> |
| 131 | + |
| 132 | +Со временем функционал расширялся, в нем появлялись новые вещи (вроде декораторов) и обработчик языка становился умнее (например появился вывод типов). |
| 133 | + |
| 134 | +<!-- v --> |
| 135 | + |
| 136 | +Какую еще проблему решает Typescript? |
| 137 | + |
| 138 | +<!-- v --> |
| 139 | + |
| 140 | +```js |
| 141 | +/** |
| 142 | + * Returns city map url |
| 143 | + * @param {string} city |
| 144 | + * @return {string} url |
| 145 | + */ |
| 146 | +function getCityMap(city) { |
| 147 | + return `https://map.com?q=${city}`; |
| 148 | +} |
| 149 | +``` |
| 150 | + |
| 151 | +Какая проблема с этим кодом? |
| 152 | + |
| 153 | +<!-- v --> |
| 154 | + |
| 155 | +Указание типов |
| 156 | + |
| 157 | +- документирует код описанием контрактов |
| 158 | +- позволяет проверять использование кода на соответствие контрактам (и чем больше кода, тем это сложнее и важнее) |
| 159 | + |
| 160 | +<!-- v --> |
| 161 | + |
| 162 | +**Важно!** Typescript _(как и другие языки транспилирующиеся в JS)_ **НЕ работает в браузере**. |
| 163 | + |
| 164 | +Т.е. все его проверки работают только в момент написания или сборки кода! _(в браузере будет работать уже javascript, полученный при транспиляции Typescript)_ |
| 165 | + |
| 166 | +<!-- v --> |
| 167 | + |
| 168 | +### Вопросы? |
| 169 | + |
| 170 | +<!-- s --> |
| 171 | + |
| 172 | +### Зачем мы будем работать с Typescript |
| 173 | + |
| 174 | +<!-- v --> |
| 175 | + |
| 176 | +1. Экономит нервы и время (поначалу код на typescript может писаться дольше, но со временем эта проблема уходит) |
| 177 | +1. Когда то _был_ еще [flow language](https://flow.org/), но сейчас Typescript самая популярная "альтернатива" js |
| 178 | +1. _"Необходим"_ для больших проектов (и очень рекомендован для маленьких) |
| 179 | +1. Востребован при поиске работы |
| 180 | +1. Улучшает понимание работы кода и понимание некоторых паттернов |
| 181 | + разработки |
| 182 | + |
| 183 | +<!-- v --> |
| 184 | + |
| 185 | +Что мы разберем на курсе: |
| 186 | + |
| 187 | +- как использовать базовые возможности языка (базовые типы, интерфейсы, типизация функций) |
| 188 | +- как настроить окружение для работы |
| 189 | +- как применять некоторые "продвинутые" темы (немного generic, вывод типов,кастинг) |
| 190 | + |
| 191 | +<!-- v --> |
| 192 | + |
| 193 | +Базовые темы мы разберем отдельным занятием, остальное будем смотреть по ходу остальных занятий. |
| 194 | + |
| 195 | +<!-- v --> |
| 196 | + |
| 197 | +Дальше код будет писаться на Typescript. |
| 198 | + |
| 199 | +<!-- v --> |
| 200 | + |
| 201 | +### Вопросы? |
| 202 | + |
| 203 | +<!-- s --> |
| 204 | + |
| 205 | +### Установка, настройка и запуск Typescript |
| 206 | + |
| 207 | +<!-- v --> |
| 208 | + |
| 209 | +1. Создать новый npm-проект |
| 210 | +1. Установить пакет [`typescript`](https://www.npmjs.com/package/typescript) |
| 211 | +1. Инициализировать конфигурацию для Typescript |
| 212 | +1. Создать файлы |
| 213 | +1. Выполнить команду `npx tsc` (Для проверки, без сборки `npx tsc --noEmit`) |
| 214 | + |
| 215 | +<!-- v --> |
| 216 | + |
| 217 | +```bash |
| 218 | +mkdir typescript-test |
| 219 | +cd typescript-test |
| 220 | + |
| 221 | +npm init -y |
| 222 | + |
| 223 | +npm install typescript --save-dev |
| 224 | + |
| 225 | +npx tsc --init |
| 226 | + |
| 227 | +echo "export function x(n: number) { console.log('x with n', n); }" > "x.ts" |
| 228 | +echo "import { x } from './x'; " > "index.ts" |
| 229 | +echo "function y() { x(1); }" >> "index.ts" |
| 230 | +echo "y();" >> "index.ts" |
| 231 | + |
| 232 | +npx tsc |
| 233 | +``` |
| 234 | + |
| 235 | +<!-- v --> |
| 236 | + |
| 237 | +### Вопросы? |
| 238 | + |
| 239 | +<!-- s --> |
| 240 | + |
| 241 | +Дополнительные материалы: |
| 242 | + |
| 243 | +- [The TypeScript Handbook (30 минут для быстрого старта)](https://www.typescriptlang.org/docs/handbook/intro.html) |
| 244 | +- [Основное про типы в TS](https://canonium.com/category/typescript) |
| 245 | +- TypeScript как будущее энтерпрайзного JavaScript [1](https://dou.ua/lenta/articles/typescript-1/) и [2](https://dou.ua/lenta/articles/typescript-2/) |
| 246 | +- [Глубокое погружение в TypeScript](https://github.com/etroynov/typescript-book) |
0 commit comments