如何在 TypeScript 中输入异步函数

在 TypeScript 中输入异步函数

How to type an async Function in TypeScript

要在 TypeScript 中键入异步函数,请将其返回类型设置为
Promise<type>.
即使您没有显式返回值,
标记的函数
async也保证返回a,因此在指定函数的返回类型时应使用泛型。PromisePromise

索引.ts
type GetNumber = (num: number) => Promise<number>; // ✅ Arrow function with Type const getNumber: GetNumber = async (num) => { const result = await Promise.resolve(num); return result; }; interface IGetNumber { (num: number): Promise<number>; } // ✅ Arrow function with Interface const getNumber2: IGetNumber = async (num) => { const result = await Promise.resolve(num); return result; }; // ✅ Arrow function inline const getNumber3 = async (num: number): Promise<number> => { const result = await Promise.resolve(num); return result; }; // ✅ Named function inline async function getNumber4(num: number): Promise<number> { const result = await Promise.resolve(num); return result; }

代码片段中的示例展示了如何将类型定义添加到异步函数。

前两个示例使用类型和接口来键入异步函数。语法不同,但概念相同——
异步函数
总是返回一个承诺,该承诺以函数的返回值解析
async

如果异步函数抛出错误,则它返回一个
Promise,它将被拒绝并从异步函数中抛出异常。

我们传递给Promise泛型的类型是async函数返回值的类型。

如果异步函数没有返回值,则应将异步函数的返回类型设置为Promise<void>.

索引.ts
async function logNumber(num: number): Promise<void> { await Promise.resolve(); console.log(num); }

如果异步函数抛出错误,则应将其返回类型设置为
Promise<never>.

索引.ts
async function logNumber(num: number): Promise<never> { await Promise.resolve(); throw new Error('Something went wrong'); }

Promise如果您在指定异步函数的返回类型时忘记设置使用泛型,您将收到一条明确的错误消息。

索引.ts
// ⛔️ Error: The return type of an async function or method // must be the global Promise<T> type. // Did you mean to write 'Promise<never>'? async function logNumber(num: number): never { await Promise.resolve(); throw new Error('Something went wrong'); }
键入函数时唯一要注意的async是它的返回类型始终是一个承诺,无论它是否返回值、不返回值或抛出错误。

这就是为什么Promise在键入异步函数的返回值时应始终使用泛型。

发表评论