Skip to content

Обработать замечания #219

@fey

Description

@fey

Замечания от Сергея М

  • Странная штука с уроками в TS. Студент знакомится с Union:

    При том между 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

    Урок:

    Задание:

    В решении учителя несколько проблем:

    1. Усложнённое решение
    2. Нарушен принцип сокрытия реализации

    Так как 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 относится к статическим - это значит, что...
    • Преимущества динамического
    • Недостатки динамического
  • Почему вдруг появился фронтенд и команды разработчиков?

    Какие особенности у TypeScript
    Сейчас у фронтенд-приложения могут быть большие команды в десятки и сотни разработчиков.

  • Про установку

    Поэтому установка TypeScript предельно простая:

    Ещё текст

    Также можно использовать более простой способ. Можно поставить пакет ts-node, который выполняет одновременно компиляцию и запуск

    Кажется, автор говорит про более простой способ, чем установку typescript, но на самом деле, он предлагает это:

    Чтобы не компилировать код каждый раз для запуска через node, можно поставить утилиту ts-node...

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions