axios 如何为Promise.all response iterable定义正确的类型?

bvhaajcl  于 12个月前  发布在  iOS
关注(0)|答案(1)|浏览(115)

正如我们所知,Promise.all将以与所请求的iterable相同的顺序返回已解决的promise。
我试图了解如何把正确的类型为个人解决解决。我使用Axios执行异步调用。

Promise.all([
   <void, A>call an API a with response type A,
   <void, B>call another API b with response type B,
   <void, C>call another API c with response type C
]).then(([
       Response aa of type A: ?,
       Response bb of type B: ?,
       Response cc of type C: ?
   ]) => {
});

字符串
的所有响应都是AxiosResponse<A | B | C>类型。但是如果我显式地设置它,当阅读一个响应类型中的属性时,我将面临问题。例如:编译器将抱怨bb.test,如果属性test不存在于aacc中。
下面这句话是否可以明确地告诉你个人的React是哪种类型?

]).then(([
       Response aa of type A: AxiosResponse<A>,
       Response bb of type B: AxiosResponse<B>,
       Response cc of type C: AxiosResponse<C>
   ]) => {


注意:编译器会隐式地处理类型。

c0vxltue

c0vxltue1#

如果你像你的问题中那样将数组指定为文字,它应该可以工作。正如Bergi在注解中所写的,Promise.all被声明为接受元组类型。

declare var a: Promise<A>;
declare var b: Promise<B>;
declare var c: Promise<C>;

Promise.all([a, b, c]).then(([a1, b1, c1]) => {
  (a1);
  //^? (parameter) a1: A
  (b1);
  //^? (parameter) b1: B
  (c1);
  //^? (parameter) c1: C
});

字符串
然而,TypeScript会假设如果你声明一个数组,它会试图找到一个与数组中所有元素兼容的“最佳通用类型”。这会干扰你将数组解构为特定类型的能力。

let array = [a, b, c];
//  ^? let array: (Promise<A> | Promise<B> | Promise<C>)[]

Promise.all(array).then(([a1, b1, c1]) => {
  (a1);
  //^? (parameter) a1: (A | B | C)
  (b1);
  //^? (parameter) b1: (A | B | C)
  (c1);
  //^? (parameter) c1: (A | B | C)
});


要保留类型但仍然使用数组,您必须使用constAssertas const来指示TypeScript将其视为元组,就像它在第一个示例中所做的那样。

let tuple = [a, b, c] as const;
//  ^? let tuple: readonly [Promise<A>, Promise<B>, Promise<C>]

Promise.all(tuple).then(([a1, b1, c1]) => {
  (a1);
  //^? (parameter) a1: A
  (b1);
  //^? (parameter) b1: B
  (c1);
  //^? (parameter) c1: C
});


请参阅TypeScript playground以获取上面的示例。

相关问题