Typescript 如何定义“Promise.all”的返回类型?

Typescript 如何定义“Promise.all”的返回类型?,typescript,es6-promise,Typescript,Es6 Promise,不知道这里发生了什么。我对我的类型做了什么奇怪的事 const reflect = (promise): Promise<Reflection> => promise.then( (value) => ({ value, resolved: true }), (error) => ({ error, rejected: true }) ); const to = (promiseArr) => { re

不知道这里发生了什么。我对我的类型做了什么奇怪的事

const reflect = (promise): Promise<Reflection> =>
    promise.then(
        (value) => ({ value, resolved: true }),
        (error) => ({ error, rejected: true })
    );

const to = (promiseArr) => {
    return Promise.all(promiseArr.map(reflect)).then((sources: Reflection[]) => sources);
};
const reflect=(promise):promise=>
我保证,那么(
(值)=>({value,已解析:true}),
(错误)=>({错误,已拒绝:true})
);
const to=(promiseArr)=>{
return Promise.all(promiseArr.map(reflect))。然后((sources:Reflection[])=>sources);
};
类型的参数“(来源:Reflection[])=>Reflection[]”不可分配给类型的参数“(值:[未知、未知、未知、未知、未知、未知])=>Reflection[]| PromiseLike”。
参数“源”和“值”的类型不兼容。
类型“[unknown,unknown,unknown,unknown,unknown,unknown,unknown]”不能分配给类型“Reflection[]”。
类型“未知”不可分配给类型“反射”。ts(2345)

这取决于您的
反射类型,但听起来它可能应该采用resolve值的类型参数,如果Promise解析,可能类似于

type Reflection<T> = {
    value: T;
    resolved: true;
} | {
    error: unknown;
    rejected: true;
}
这将正确编译,TS将
检测为
的类型为:

const to: <T>(promiseArr: Promise<T>[]) => Promise<Reflection<T>[]>

这是一个怎样的javascript问题?@Noob感谢您的细心和敏锐的眼光。我删除了标签。我建议签出,这可能是错误处理更惯用的解决方案:很难理解
const reflect=(promise:promise):promise=>
应该是什么。
是一个类型参数。这意味着,当参数是
(promise:promise)
(解析为T类型的某个承诺)时,函数返回一个
反射,如果解析,则解析为相同的T类型;这是您希望能够在编译时执行的静态类型检查。明白了。我认为这是一个语法错误,因为我的ts linter没有得到它。我没有看到任何错误。我添加了一个到TS游乐场的链接,它没有看到任何错误
to
已经返回了一个承诺,该承诺解析为一系列反射。承诺通过
Promise.all
(然后
reflect
重新格式化)转换为它们的解析值。在你看到
的每一种情况下,(arg=>arg)
,它都是多余的——它接受了一个解析为
arg
的承诺,并产生了一个解析为
arg
的承诺。它没有任何作用。
const reflect = <T>(promise: Promise<T>): Promise<Reflection<T>> =>
    promise.then(
        value => ({ value, resolved: true }),
        error => ({ error, rejected: true })
    );

const to = <T>(promiseArr: Array<Promise<T>>) => {
    return Promise.all(promiseArr.map(reflect)).then((sources: Array<Reflection<T>>) => sources);
};
const to: <T>(promiseArr: Promise<T>[]) => Promise<Reflection<T>[]>
const to = <T>(promiseArr: Array<Promise<T>>) => {
    return Promise.all(promiseArr.map(reflect))
};