Сергей Мелюков

Сергей Мелюков

Темы
Неделя
Aug 10, 2020 → Aug 13, 2020

Архив недели @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})

🔥Тред (Сергей Мелюков)

Ссылки