在TypeScript中定义一个数组类型

3

我正在一个项目中使用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个回答

2
您可以使用类型别名来定义这样的类型:
type ResponseParams = [FirstType, SecondType, ..., NthType]

但我想指出,如果不进行显式类型注释,array 的类型将被推断出来(至少对于最多 10 个 promises):

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
});

谢谢,我记得有类似的东西,但是在谷歌上没找到。当Promise的解析类型未定义且您想保持代码更清晰时,它仍然可以很有用(至少在我看来)。 - Christian Vincenzo Traina
1
@CristianTraìna 是的,当然,这很有用。我只是想确保你知道大多数情况下不需要拼出类型 :) - Titian Cernicova-Dragomir

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

@CristianTraìna,您能解释一下为什么您认为这是太多的样板文件吗? - k0pernikus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接