Как избежать того, что асинхронная функция в качестве аргумента может привести к не отловленной ошибке

Асинхронная функция в качестве аргумента может привести к не отловленной ошибке.

Переделываю старый код на async-await и где-то использовал уже асинхронные функции в качестве аргумента при вызове другой функции.

То есть просто игнорировал то, что они вернут промис, который в данном случае просто не нужен (не важно когда завершится функция и что будет в нагрузке промиса).

Если в таких асинхронных функциях-аргументах случится ошибка, то она выскочит на самый верх и убьёт процесс в ноде. Или в браузере просто будет в консоли.

Вопрос:

Как избегать данных ситуаций средствами typescript, webstorm или чем-то ещё?

Нужно чтобы что-то мне во всём проекте подсветило данные места или не давало игнорировать возвращаемые промисы при использовании таких функций. Их очень легко принять за обычные и подложить себе мину. А так как уже много чего написал, то просто не реально уже найти все ситуации.

Пример кода:

async function myFunction(){
    console.log('ура, типа как синхронная');
    await new Promise(( _, reject )=>{
        setTimeout( ()=>{
            console.log('нате вам ошибочку! (см. в консоли браузера)');
            reject( Error('some-error') );
        }, 1500 );
    });
}

setTimeout( myFunction, 0 ); // <--- Тут мне нужна какая-то подсветка или запрет оставлять без catch

Ищу что-то похожее на это:

Вот более-менее приемлемый вариант в вебшторме, но только для тела синхронных функций, а мне нужно для аргументов:

введите сюда описание изображения


Ответы (1 шт):

Автор решения: qwabra

Тут мне нужна какая-то подсветка или запрет оставлять без catch

  • единственное что нашел - TSLint no-floating-promises (не проверял)

Выглядит как узкоспециализированная хотелка - расширяем задачу: "подсветка асинхронных функций".

  • Искал плагин для VSCode - не нашел. :(

TSLint no-floating-promises

а вообще

Как мне кажется, это должно решаться на уровне языка (типизированного). Если мы ждём на входе функцию (function f1(f: Function): {}) - она должна быть простой функцией а не промисом.

Так что для меня, эта ситуация выглядит как ?баг/кривизна TS.

песочница там

function foo(): void { }
async function fooAsync(): Promise<void> { }


T1: {
    type $FooAsync = (...args: any[]) => Promise<void>
    function f1(f: $FooAsync) { }
    // @ts-expect-error
    f1(foo) // как и ожидалось - ошибка
}
T2: {
    function f1(f: Function): {}
    // @ts-expect-error
    f1(fooAsync) // нет ошибки

    type $Function = (...args: any[]) => void
    function f2(f: $Function) { }
    // @ts-expect-error
    f2(fooAsync) // нет ошибки
}

// @ts-expect-error - https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-9.html#-ts-expect-error-comments


P.S.

Кто смелый - может зайти в песочницу по ссылке и прямо оттуда создать баг репорт. Ну или хотя бы proposal.

→ Ссылка