在 TypeScript 中输入异步函数
How to type an async Function in TypeScript
要在 TypeScript 中键入异步函数,请将其返回类型设置为
Promise<type>
.
即使您没有显式返回值,标记的函数async
也保证返回a,因此在指定函数的返回类型时应使用泛型。Promise
Promise
索引.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
在键入异步函数的返回值时应始终使用泛型。