Search
Write a publication
Pull to refresh
10
0
Константин Логиновских @Konstantin_Loginovskikh

Frontend

Send message

Удивительно, что микрофронты все еще актуальная тема
Казалось, что те, кому это нужно, уже более менее определились, а те, кто просто интересовались, удовлетворили свое любопытство

Вы невнимательно читали =) Интерфейс бека генерируется автоматом, мне при изменении нейминга вообще делать не придется ничего, все сделает ts, в этом и прелесть
Вы же не демаете, что нет сервисной функции, которая выполняет запрос?

Окей, в этой ситуации вы содержите те же 30 строк, только размазанные по проекту, появляется дополнительное место для поддержки и все такое (ведь адаптер придется и в js написать, верно?). Тоже вариант
Кажется, за это мы и любим программирование, что в нем есть десятки способов решить одну и ту же задачу

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

Именно из-за различных пониманий термина я и описал, что именно подразумеваю, говоря "рефакторинг".
Могут быть разные мнения на этот счет, в статье приведены техники, которые что-то вроде паттернов проектирования, они нацелены на улучшение кода, не изменяя его функциональность
Вообще таких техник довольно много (тот же Фаулер описывает их аж 64 в своем классификаторе), но на практике многие из них не применяются или являются слишком сложными.
В статье как раз описаны некоторые очень простые способы, как можно сделать приложение лучше и не поломать то, что работает, даже если это глубокое легаси 🙂.

Тут ответ несколько проще - это внешнее апи, которое вы не контроллируете. Хотите перелопатить им бекенд - вперед, это тоже путь. Но кому-то, возможно, нужно более быстрое решение, к тому же, не прям уж оно сложное (все утили вместе с тестами улеглись в 30 строк!)

Есть такая тема, именно из-за нее в конце статьи есть тесты на типы XD)
Если практически отвечать на этот вопрос, то такие типы не требуют поддержки, а использование в коде выглядит довольно прозрачно, ex

type RequestPayload = RequireOnlyOne<SwaggerRequestPayload>;

В целом, с перого раза понятно, что делает этот код, а тесты позволяют быть уверенным, что он выполняет свою работу

В дополнение к предыдущему комменту (кстати, этот момент описан в статье), еще добавлю, что мы используем автотипы из сваггера, то есть начальный тип уже у нас есть. Нам нужно только его переработать под конкретные нужды.
Когда-нибудь, когда сваггер начнет адекватно размечать такие типы, заживем =)

Не будет, тк _cat ts распарсит как пустая строка + нижнее подчеркивание + cat, поэтому, если строка начинается с нижнего подчеркивания, для этой функции это тоже валидный snake_case

И снова большое спасибо)
Я не знаю, кто вы, но ваши комменты бесценны (без иронии)

PS. Да, последний пример исключение, тк пересечение является флагом для ts, а наличие/отсутствие флага воспринимается как отличающий признак (вроде как)
Но тут спасает другая привычка - при описании комплексных типов я обычно использую подобный код

type Prettify<T> = T extends Record<string, unknown> ? {
  [K in keyof T]: T[K];
} : T

Он нивелирует все флаги и пересечения, делая сравнение максимально точным
Если мы добавим этот код в Equals, то, вероятно, это и будет максимально строгое сравнение

Почему же?
Вот написали вы тип по типу такого

type ExtractPath<T extends string> = T extends `:${infer Param}` ? Param : never;

type ExtractPaths<T extends string> =
  T extends `${infer Left}/${infer Right}`
    ? ExtractPaths<Left> | ExtractPaths<Right>
    : ExtractPath<T>;

type PathParams<T extends string> = Prettify<Record<ExtractPaths<T>, string>>;

Как вам убедиться, что все это работает и потом поддерживать? В обычном js мы спокойно берем условный jest и покрываем решение тестами, но тестов на типы в ts просто нет
В этот момент вы используете описанные в статье шаги и пишете тест-кейсы, например, такие

type Cases = [
  Expect<Equals<ExtractPath<':user'>, 'user'>>,
  Expect<Equals<ExtractPath<'user'>, never>>
]

И достигаете сразу двойную пользу - ревьюер(пользователь в лице другого разраба) сразу видит, как работает этот код, а при его изменениях ts защитит вас от неожиданного поведения и поломок

Вся эта кухня нужна ровно с той же целью, как и автотесты, только для сложных типов, которые с первого раза иногда прочитать то сложно, не то чтобы проанализировать

Из X опрошенных 29% процентов разработчиков признались, что накручивали опыт
А 71% не признались XD

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

Наверное, можно пройтись по массиву через infer First, ...infer Rest, это должно сработать, как думаете?

Это не кортежи, это такой массив 💁‍♂️
Если серьезно, хороший вопрос, я не думал о преобразовании кортежей (из наших 1000+ ручек ни одна не использует кортежи)
Вообще идея интересная, можно поресерчить, спасибо)

Ждали этого коммента 😅
Серьезно, пора начать)

Спасибо, я очень старался 😇
Отвечу ссылкой: https://api.reactrouter.com/v7/functions/react_router.useRoutes.html
Да, этот момент продуман, мы используем несколько хелперов, чтобы разделить структуру страницы и вклеивание в нее конечных элементов
Возможно, напишу и об этом как-нибудь =)

Коммент топ
Доберусь до компа, докину в статью, спасибо =)
Полностью решение забирать не буду, иначе всю статью надо будет переписать, но Arg хелпер завезу

Эта функция не является целью статьи и оставлена только для тех, кто хочет прямо сейчас взять и попробовать все на практике.
Но даже в реальном проекте она допустима, тк это "условно библиотечная реализация"
Функция пишется один раз и густо покрывается тестами, поэтому мы спокойно можем быть уверены в ее корректности
Чисто технически, мы можем добавить здесь тайпгарды и, возможно, стоило (мне было лень да и статья не об этом)
Ну и стоит добавить, что ts не умеет типизировать Object.keys - а мы то с вами знаем, что он вернет, верно?)
И смысл в применении остается, тк все вызовы функции будут работать как часы)

Кажется, автор забыл упомянуть, насколько сложным и объемным является производство мобильных приложений, где он в данный момент трудится

1

Information

Rating
Does not participate
Location
Екатеринбург, Свердловская обл., Россия
Works in
Date of birth
Registered
Activity