Обо мне
Привет. Я разработчик и последние три года пишу на TypeScript, смотрю на технические тренды и пытаюсь делать полезные проекты и публиковать их в OpenSource.
Сразу к делу
Вот уже как год, я пишу код, и использую этот пакет Effect. Для меня Effect является швейцарским ножом, который позволяет решать прикладные задачи, без написания рутинного но очень важного кода, такого как:
работа с ошибками и восстановление из этого состояния (catch)
кеширование результатов дорогих вычислительных операций
параллельное выполнение процессов, остановка (interrupt)
работа с состоянием и безопасное изменение этого состояния
создание схем типов данных, чтение/запись по схеме, и т.п.
и многое другое
Effect состоит из большого количества небольших модулей и помогает писать код в декларативном стиле. Например в этом пакете можно найти следующие модули:
Array
HashMap
String
и десятки других...
Казалось бы, зачем нужен Array, ведь он есть в стандарте JS, но он нужен, когда нужно создать такие типы как NonEmptyReadonlyArray, или другой неизменяемый Array (который является кортежем)
Effect позволяет мне, как TypeScript разработчику, держать фокус на главной части проекта и не распыляться на чисто технические задачи, никак не связанные с целью проекта.
При чем тут эффекты?
Effect – это ещё идея о том, как можно и нужно писать программы, которые легко читать, писать и поддерживать.
Если вкратце, то эффект - это описание любого процесса, который может завершиться либо ошибкой, либо результатом, и ему может понадобиться некий контекст выполнения для того чтобы корректно отработать.
Эффект - это значение, как ,например, можно создать const foo = "bar"
, где foo будет содержать значение "bar".
Например:
const getTodo = (
id: number
): Effect.Effect<unknown, HttpClientError> =>
httpClient.get(`/todos/${id}`).pipe(
Effect.andThen((response) => response.json)
)
Тут описывается функция, которая создает эффект. Когда функция getTodo
возвратила эффект, то она не выполнит HTTP запрос, она лишь вернет эффект, который умеет посылать HTTP запрос, и он может завершиться значением с типом unknown или завершиться с ошибкой типа HttpClientError.
Так как эффект - это значение, то это открывает дополнительные возможности, и можно легко создать другой эффект на базе этого, который будет:
восстанавливаться если была ошибка типа HttpClientError
попытаться повторно выполнить эффект несколько раз в случае определенной ошибки
кешировать результат
множество других сценариев...
Про то, что такое эффект можно на примерах найти тут.
Сообщество Effect пишет отличную документацию по многим пунктам.
Пока на этом все
Я не нашел на хабре упоминаний про эту библиотеку. Цель этой статьи - заинтересовать TypeScript-разработчиков и попробовать использовать ее в своих задачах.
Я могу подробнее написать в следующий раз статью про свой опыт работы с Effect в более подробной форме. У меня нет цели написать туториал или что то подобное, потому что Effect сообщество очень круто справляется с этой задачей
Ссылки
как работать с ожидаемыми/не ожидаемыми ошибками
мои библиотеки которые используют Effect