Архив недели @smelukov
Понедельник
Привет мир! Я Сергей Мелюков (@smelukov). Работаю архитектором в Яндекс Маркет. Люблю ООП, сборщики (особенно самописные ;)), gamedev и музыку.
Сравнительно недавно веду свой проект WDX Lab - wdx-lab.com
Хочется немного пообщаться ☺️ Как вы относитесь к хелперам модификации типов типа Pick/Omit/etc в TS/Flow
🤔
58.2%
Знаю, использую🤔
12.0%
Знаю, не использую🤔
29.8%
Не знаюСобственно, к чему это... Я противник нескольких вещей:
- хелперы/утилиты модификации типов
- type union (||) и type intersection (&&, ...)
- infer
- any
Уверен, что описывать типы и писать ООП код можно и без них. Давайте обсудим всё по-очереди
Utility Types - набор функций. На вход поступает один тип, на выходе - другой
Используются для извлечения/модификации типов. Например, Pick извлекает поля из типа, а ReturnType - возвращаемый функцией тип
Часто это сокращает время на написание нового кода. Но есть и минусы
Как минимум ухудшается читаемость/поддерживаемость кода, особенно при большой вложенности
Часто применяются не потому, что выходной тип зависит от входного, а просто потому, что типы были похожи и лень было описывать новый тип
В итоге, изменив входной тип, мы сломаем места, в которых используется выходной тип, их нужно будет рефакторить. Ситуация осложнится еще и в том случае, когда в системе есть типы, которые будут зависеть от тех, которые будут сломаны
Если мы хотим именно расширить тип и выходной реально зависит от входного, то стоит задать себе вопрос: а правильно ли мы описали базовый тип? Или: зачем нам понадобилось расширять тип? Могли ли мы учесть все это в базовом? Не путаем ли мы типы с классами?
Давайте попробуем устроить интерактив: присылайте свои примеры использования хелперов (пример кода и описание того, какую проблему решали) и я расскажу как можно было обойтись без них. Должно быть интересно ☺️
Четверг
Далее по списку идут type union/intersection
В TS/Flow есть вещи, которые, к сожалению, нельзя реализовать без них.
Тут в голову приходит два примера:
- & в наследовании типов
- | в nullable-значения
Про наследования типов
В случае с ООП-кодом можно просто наследовать один класс от другого и готов, но в ином случае придется испольовать &: flow.org/try/#0PQKgBAAg…
К слову, в C++ есть наследование структур (cpp.sh/6yixw) но этим все и ограничивается, а вот в TS/Flow мы можем смешивать типы прямо в описании параметров, создавая временные типы на лету
Чистой воды увеличение энтропии
Про nullable
С flow проще, там можно описать поле(foo: ?string) которое сможет легально принимать null
Да, туда можно будет записать и undefined, а это еще один тип
Например, в "пустой" переменной, в языке С, хранится мусор, который все равно имеет тип этой переменной
А вот в TS нужно явно указать, что в поле можно записать null ({foo: string | null})
Тред (Сергей Мелюков)