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

Я попытался определить тип async-функции, но не удалось выполнить компиляцию, см. ниже:

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 ''
    }
}

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

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

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

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

Ответ 4

Простой путь.

export interface SignUpReturn {
  user_id: string
  platform: string
  name: string
  image_url: string
  email: string
}

export interface SignUpType {
  platform: string
  loginId: string
  password: string
  name: string
  email: string
}

const SignUp = async (userInfo: SignUpType) => {
  try {
    const data: SignUpReturn = await client.request(query, userInfo)
    return data
  } catch (error) {
    throw error
  }
}

export default SignUp

или

const SignUp = async (userInfo: SignUpType): Promise<SignUpReturn> => {
  try {
    const data = await client.request(query, userInfo)
    return data
  } catch (error) {
    throw error
  }
}