В машинописном тексте, как определить тип асинхронной функции

92

Я попытался определить тип асинхронной функции, но не смог скомпилировать, см. Ниже:

interface SearchFn {
    async (subString: string): string;
}

class A {
    private Fn: SearchFn
    public async do():Promise<string> {
        await this.Fn("fds") // complain here: cannot invoke an expression whose type lacks a call signature
        return ''
    }
}

Может ли кто-нибудь помочь мне разобраться с этим?

Рон
источник
Обещание <boolean> не работает?
toskv 03
Покажите, пожалуйста, как / где вы определяете Fn.

Ответы:

167

Нашел этот поиск, как объявить "typedef" для асинхронной стрелочной функции.

Это работает, если вы просто объявите возвращаемый тип функции Promise:

interface SearchFn {
    (subString: string): Promise<boolean>;
}

или как объявление типа:

type SearchFn = (subString: string) => Promise<boolean>;

Microsoft TS Linter порекомендует второй синтаксис.

Тьяго Баркала
источник
3
Умно, спасибо, async func на самом деле является функцией, возвращаемой Promise.
Рон
@Ron стоит упомянуть, что это неверно, асинхронная функция просто использует ожидание. См. Ответ Мотти
Code Novitiate
Люди должны отметить, что функция, возвращающая обещание, не обязательно является асинхронной функцией.
liaguridio
1
что, если нет возвращенного значения? ): Promise<undefined>терпит неудачу для меня. Мне просто нужна функция async, чтобы я мог использовать ее awaitвнутри ...
dcsan
3
@dcsan Promise <void>
Тьяго Баркала
25

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

Это значит, что async имеет значение только для реализации функции, но не для ее интерфейса . Поэтому наличие asyncметода интерфейса бесполезно, вы хотите сказать, что функция возвращает определенное Promise(в вашем случае Promise<string>), но вы не хотите, чтобы средство реализации интерфейса реализовало это определенным образом (используя await).

Как говорили до меня другие:

interface SearchFn {
    (subString: string): Promise<string>;
}

Затем любой, кто решит реализовать эту функцию, может использовать async простой старой Promise.thenили, возможно, даже какой-то новой методологии, которая появится в будущем.

Мотти
источник
1
Отличный ответ и лаконично объясняет «почему».
Code Novitiate
8

Передайте тип возвращаемого объекта в универсальный объект Promise.

type SearchFn = (subString: string): Promise<string>;

В качестве альтернативы вы можете объявить AsyncFunctionуниверсальный тип.

type AsyncFunction <A,O> = (...args:A) => Promise<O> 
type SearchFn = AsyncFunction<[string], string>

AsyncFunction - это универсальный тип, который принимает две переменные типа - тип ввода (A) и тип вывода.

Бен Карп
источник