-
Notifications
You must be signed in to change notification settings - Fork 86
Description
Замечания от Сергея М
-
Странная штука с уроками в TS. Студент знакомится с Union:
- на 3 уроке https://code-basics.com/ru/languages/typescript/lessons/type-aliases#:~:text=//-,union,-%D1%82%D0%B8%D0%BF%20%D0%B8%D0%B7%20%D1%82%D1%80%D0%B5%D1%85
- отдельно на 25 https://code-basics.com/ru/languages/typescript/lessons/type-as-sets
- и ещё раз сразу на 26 https://code-basics.com/ru/languages/typescript/lessons/union-types
При том между 3 и 25 уроком столько раз используются юнионы, что непонятно зачем уроки в середине курса. Их тогда уж логично сделать третьим уроком и дальше использовать спокойно. А 25й урок словно вообще не про то должен был быть
-
29 https://code-basics.com/ru/languages/typescript/lessons/intersection-types задание слишком хитрожопое, особенно на фоне остальных очень простых заданий. Тут сразу и рекурсия, и связные списки, и тесты на внимательность и при этом очень плохо подсвечена основная идея пересечений, так как тип создаётся новый почти целиком. Нужно что-то кардинально иное
Реализуйте функцию `reverseDoubleLinkedList`, которая принимает двусвязный список с числовым полем `value` и разворачивает его. -
30 https://code-basics.com/ru/languages/typescript/lessons/assignability
Урок:
Из текста урока непонятно что за проблематика, как она решается. В коде урока задействованы две переменные, которые нигде не указываются. В функцию, принимающую строку передаётся булево значение зачем-то. Какой-то набор случайных фактов просто.
Задание:
Задание сформулировано так, что никакого функционала делать не нужно, просто вернуть true и false.
-
31 https://code-basics.com/ru/languages/typescript/lessons/type-hierarcy
Урок:
То ли текст урока пытается рассказать прописные истины “нельзя присвоить число вместо строки” очень сложным научным языком, то ли начинает объяснять что-то и бросает на полпути.
Задание:
В решении учителя используются Record и дженерики, которые ещё студенты не проходили.
Типобезопасное решение:
const defaultUser = { id: 0, name: '', age: 0 }; const getUserFriends = (userResponseJSON: string, userId: number): User[] => { const userResponse: UserResponse = JSON.parse(userResponseJSON) as UserResponse; return userResponse.friends .map(([ownerId, friendId]: Friends): User => { if (!(userId === ownerId || userId === friendId)) return defaultUser; const searchId = (ownerId === userId) ? friendId : ownerId; const friend: User | undefined = userResponse.users.find(({ id }) => id === searchId); return friend === undefined ? defaultUser : friend; }) .filter((user: User) => user.id > 0); };
-
34
https://code-basics.com/ru/languages/typescript/lessons/class-fields
Урок:
Задание:
Сказано, что надо реализовать метод, а в тестах проверяются свойства. Надо или поменять тесты, или уточнить задачние.
Вообще, зачем упражнение на создание класса, если мы изучаем типы?
-
35
https://code-basics.com/ru/languages/typescript/lessons/class-as-types
Урок:
Задание:
В решении учителя несколько проблем:
- Усложнённое решение
- Нарушен принцип сокрытия реализации
Так как isCopy - это служебное поле для внутренней логики класса, оно не должно быть видно снаружи пользователям этого класса. Иначе можно сделать так:
new File({ name: ‘’ size: 0, **isCopy: true** })
— на функциональности это не скажется, но isCopy висит в подсказках редактора. А мы типизируем всё, чтобы редактор не подсказывал фигню.Поэтому на входящие параметры должен быть тип или интерфейс на весь класс, а
isCopy
остаётся чисто приватным методом и используется только внутри, пользователь его не передаёт. Упрощённое и правильно типизированное решение:type OpitonName = string; type OpitonSize = number; type FileOptions = { name: OpitonName, size: OpitonSize }; class File { name: OpitonName; size: OpitonSize; private isCopy: boolean; constructor(options: FileOptions) { this.name = options.name; this.size = options.size; this.isCopy = (options instanceof File); } toString(): string { const copyString = this.isCopy ? '(copy) ' : ''; return `${copyString}${this.name} (${this.size} bytes)` } }
-
Разбор структуры текста
В программировании языки делятся на две большие группы: динамически типизированные и статически типизированные. Преимущества TypeScript появляются за счет того, что JavaScript относится к первой группе. У таких языков есть интерпретатор — программа, которая выполняет код построчно без предварительного анализа:
Два примера кода
TypeScript относится к статически типизированным языкам, поэтому работает по-другому. Перед запуском кода этих языков на выполнение его нужно скомпилировать.
Во время компиляции проверяется, что программа типобезопасна — не содержит ошибок, подобных примеру выше. Если компилятор нашел несоответствие типов, то он останавливает компиляцию и выводит предупреждения о том, где типы не сходятся. ТСтруктура текста получается:
- Вводится понятие двух вещей в двух классах. Потом сказано что преимущества второй вещи в том что первая в другом классе :wwhat: Потом поясняется первый класс вещей.
Потом блоки кода - Потом возвращение ко второй вещи.
Ты в итоге пытаешься проследить логику, прыгая по тексту глазами вверх-вниз. Хотя можно было вводить термины и примеры постепенно:
- Есть две группы языков
- JavaScript относится к динамическим - это значит, что...
- Преимущества динамического
- Недостатки динамического
- TypeScript относится к статическим - это значит, что...
- Преимущества динамического
- Недостатки динамического
- Вводится понятие двух вещей в двух классах. Потом сказано что преимущества второй вещи в том что первая в другом классе :wwhat: Потом поясняется первый класс вещей.
-
Почему вдруг появился фронтенд и команды разработчиков?
Какие особенности у TypeScript
Сейчас у фронтенд-приложения могут быть большие команды в десятки и сотни разработчиков. -
Про установку
Поэтому установка TypeScript предельно простая:
Ещё текст
Также можно использовать более простой способ. Можно поставить пакет ts-node, который выполняет одновременно компиляцию и запуск
Кажется, автор говорит про более простой способ, чем установку typescript, но на самом деле, он предлагает это:
Чтобы не компилировать код каждый раз для запуска через node, можно поставить утилиту ts-node...