我在一个项目中使用TypeScript,在某些情况下,我需要使用Promise.all(...)
,这将返回许多项的数组:
Promise.all(
firstRequest,
secondRequest,
...,
nthRequest
)
.then((array : [FirstType, SecondType, ..., NthType]) => {
// do things with response
});
现在,由于类型[FirstType, SecondType, ..., NthType]
太长而无法在此处定义,因此我想在其他地方定义它并在此位置使用它。
所以我尝试了:
export interface ResponseParams {
[0]: FirstType;
[1]: SecondType;
...
[n]: NthType;
}
并且:
.then((array : ResponseParams) => {
// do things with response
});
但是我收到此错误:
类型'ResponseParams'不是数组类型。
如何才能外部化类型并使代码更简洁?
谢谢
答案 0 :(得分:2)
您可以使用类型别名定义此类:
type ResponseParams = [FirstType, SecondType, ..., NthType]
但是我要指出的是,array
的类型将在没有显式类型注释的情况下进行推断(至少对于10个Promise):
declare let firstRequest : Promise<{a: number}>
declare let secondRequest : Promise<{b: number}>
declare let nthRequest : Promise<{c: number}>
Promise.all([
firstRequest,
secondRequest,
nthRequest
])
.then((array) => { // array is of type [{a: number;}, {b: number;}, {c: number;}]
// do things with response
});
答案 1 :(得分:0)
Promise.all接受通用的T
,它使您可以完全控制返回类型。因此,您可以为每个希望返回的promise定义元组,同时仍保持类型。
我会使用async / await语法来做到这一点:
interface Foo {
gnarf: string;
}
interface Bar {
poit: string;
}
const createFoo = async (): Promise<Foo> => {
return {
gnarf: "random",
};
};
const createBar = async (): Promise<Bar> => {
return {
poit: "hurz",
};
};
const doStuff = async () => {
const [foo, bar] = await Promise.all<Foo, Bar>([createFoo(), createBar()]);
return `${foo.gnarf} and ${bar.poit}`;
};
doStuff().then(console.log).catch(console.error);