在TypeScript中定义数组类型

时间:2018-11-15 16:50:39

标签: typescript

我在一个项目中使用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'不是数组类型。

如何才能外部化类型并使代码更简洁?

谢谢

2 个答案:

答案 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);