Abortable интерфейс Насколько часто вы используете AbortSignal/AbortController в вашем коде? А как часто вы пишете функции, которые принимают abortSignal как параметр? Если часто, то ниже будет гайд о правильном его использовании, поскольку у нас много функций поддерживают abortSignal/abortController в виду того, что у нас автотесты и некоторые вещи можно "отменить".
Итак давайте разберем на примере fetch API
у нас есть fetch функция. Как правило часто мы выносим ее использование в что-то целевое. например getUserInf`o type GetUserInfoParams = {searchParams: SearchParams, signal?: AbortSignal} function getUserInfo(params: GetUserInfoParams ){ return fetch(https://server/get/user/info, {searchParams: searchParams, signal: signal}) } А если посмотрим на fs.readFile то увидим, что readFile также принимает signal: AbortSignal параметр. И тоже в виде поля объекта.
Так вот в типизации к Node.js в node:events завезли специальный интерфейс - Abortable который уже содержит объект с 1 полем: signal: AbortSignal
таим образом мы можем использовать типизацию для нашей функции getUserInfo так. Плюс для читаемости вынесем параметры функции в отдельный тип `type GetUserInfoParams = {searchParams: SearchParams} & Abortable function getUserInfo(params: GetUserInfoParams ) {/** implementation */}
Плюсы
- унифицированный апи: ведь у большого числа webAPI или node.js API есть поддержка abortsignal
- меньше когнитивной нагрузки, можно не писать доп/ поле каждой вашего параметра signal: AbortSignal Минусы
- такой тип есть только у node.js API и его нужно импортировать для каждой функции у которой есть поле signal
Как можно обойти минус? Создать свой глобальный тип. Например так `declare global { declare interface Abortable { signal?: AbortSignal } } #ts #typescript #nodejs #abort #tip_of_the_day @haradkou_sdet```