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