返回

Promise.all 你必须知道的优雅类型声明

前端

Promise.all 的类型声明

在 TypeScript 中,Promise.all 的类型声明如下:

Promise.all<T extends unknown[]>(values: Iterable<T | PromiseLike<T>>): Promise<T>;

其中,values 是一个 Iterable 对象,包含要并发执行的 Promise 或 PromiseLike 对象。T 是一个泛型类型参数,表示 Promise.all 返回的 Promise 对象中包含的值的类型。

使用泛型进行类型声明

在 TypeScript 4.1.3 之前,如果我们要声明一个 Promise.all 的类型,可以使用以下代码:

type PromiseAll<T> = Promise<T[]>;

然后,我们就可以使用这个类型来声明一个 Promise.all 的变量,如下所示:

let promiseAll: PromiseAll<number[]> = Promise.all([
  Promise.resolve(1),
  Promise.resolve(2),
  Promise.resolve(3),
]);

这种方法虽然可以工作,但是它不够优雅,因为它要求我们显式地指定 Promise.all 返回的 Promise 对象中包含的值的类型。

使用新方法进行类型声明

在 TypeScript 4.1.3 中,我们有了一种更优雅的方法来声明 Promise.all 的类型。我们可以使用以下代码:

type PromiseAll<T> = Awaited<Promise<T>>;

其中,Awaited 是一个内置的 TypeScript 类型,它可以将一个 Promise 对象转换为一个普通的值。使用这种方法,我们就可以声明一个 Promise.all 的变量,如下所示:

let promiseAll: PromiseAll<number[]> = Promise.all([
  Promise.resolve(1),
  Promise.resolve(2),
  Promise.resolve(3),
]);

这种方法更加优雅,因为它不需要我们显式地指定 Promise.all 返回的 Promise 对象中包含的值的类型。

总结

在本文中,我们介绍了如何使用 TypeScript 4.1.3 中引入的新方法来声明 Promise.all 的类型。这种新方法更加优雅和易读,使我们能够更轻松地编写出健壮的代码。