В настоящее время я нахожусь в переходном периоде между программистом-любителем и профессиональным разработчиком программного обеспечения.

Моя текущая цель — дойти до того, что я смогу проектировать, разрабатывать и, возможно, управлять командой людей для создания крупномасштабного внешнего/внутреннего приложения JavaScript.

Потребовалось несколько лет обучения и практики, но на данном этапе, по крайней мере, я лучше представляю, что нужно знать, чтобы «взломать» стену (которая может быть очень высокой, поверьте мне на слово).

Я не претендую на то, что я один из лучших разработчиков, однако, по моему мнению, ниже я представляю список концепций, которые мне пришлось понять на своем пути.

Поскольку список может быть довольно обширным, я собираюсь разделить его на «удобоваримые» части трех аспектов, которые я считаю сложными, так как я люблю делать что-то небольшими порциями!

  1. Управление «этим» понятием в функции:В JavaScript очень важно, чтобы вы понимали тот факт, что функции являются гражданами первого класса (например, они могут быть переданы в качестве аргумента), а также что функции работать с «этим» понятием.

Потребуется некоторое время, чтобы укрепить эту концепцию в вашем уме, особенно на практике; лучшее объяснение, которое я нашел, представлено в книге Дугласа Крокфорда «Хорошие стороны JavaScript» в главе 4 «Функции»:

› шаблон вызова метода;

› шаблон вызова функции;

› шаблон вызова Конструктора;

› Шаблон вызова Apply.

Я не собираюсь погружаться в эту тему здесь, так как я действительно думаю, что книга, упомянутая выше, отлично объясняет это, однако я могу засвидетельствовать, что я снова и снова попадал в эту главу, пытаясь понять код других людей, а также пытаясь понять почему мой код не работал.

Очень легко потерять след того, где находится ваш текущий контекст, но, к счастью, есть некоторые инструменты, которые вы можете использовать для его управления (например, функции со стрелками, которые не предоставляют свою собственную привязку «this», функция bind(), которая позволяет вам установить свое собственное «это»).

Кроме того, «это» в TypeScript имеет несколько иное значение: вы должны предоставить тип для «этого» в вашем обратном вызове (см. правило 49 в книге Дэна Вандеркама «Эффективный TypeScript»), но также вы можете быть удивлены, что «этот ” в пространстве значений (см. пункт 8 в той же книге) не совпадает с “this” в пространстве типов. Это хорошо объясняется в книге выше как «полиморфное это».

Что подводит меня к следующей концепции…

2. Разница между пространством значений и пространством типов: в TypeScript, по сравнению с JavaScript, языковые конструкции могут существовать в двух разных пространствах: они могут быть либо «понятиями значений», либо «понятиями типов».

› «this» — в JS это обычное ключевое слово «this», тогда как в TS «полиморфное» this (см. пункт 1 выше);

› «&», «|» операторы — в JS они представляют операторы «И» и «ИЛИ», тогда как в TS они представляют операторы типа «пересечение» и «объединение»;

› «const» — в JS можно использовать для объявления новых переменных, тогда как в TS используется для сужения типа;

› «extends» — в JS используется для классов, в TS также для типов;

› «in» — в JS используется в циклах, в TS используется для отображаемых типов;

› «присвоение деструктуризации» — в JS используется в ES6, чтобы сделать ваш код более лаконичным, тогда как в TS это не работает!

› «литералы» — в JS используются как константы, тогда как в JS их можно использовать и как типы;

3. Обещания: это существенная часть JS/TS, поэтому стоит настаивать на них! В двух словах, когда вы имеете дело с асинхронной операцией, обещание — это функция, которая возвращает «что-то», что можно использовать в дальнейшей операции, без необходимости блокировать поток программы в ожидании возврата этой асинхронной операции. Также стоит упомянуть, что промис имеет жизненный цикл: он начинается в состоянии ожидания (когда считается, что он не выполнен), а затем, когда асинхронная операция завершается, промис переходит в состояние «выполнено» или «отклонено».

Тонны чернил были потрачены на эту концепцию, однако лучшее объяснение, которое я нашел, — это «Глава 11» в книге Николаса С. Закаса «Понимание сценария 6 ECMA».

И последнее: не забудьте вернуться из обещаний в своем коде!

Все еще впереди: есть много важных понятий, о которых стоит упомянуть: стрелочные функции, потоки, контроль ошибок, функциональное программирование и т. д.

До следующего раза…