Javascript Promise.all在调用具有不同返回类型的多个异步函数时引发类型错误

Javascript Promise.all在调用具有不同返回类型的多个异步函数时引发类型错误,javascript,typescript,Javascript,Typescript,我有三种类型: export interface Animal { ... } export interface Cat extends Animal{ ... } export interface Dog extends Animal{ ... } export interface Iguana extends Animal { ... } 在一个单独的文件中,我使用以下语法定义了3个异步函数: const task1 = (() => Promise<Cat[]>)

我有三种类型:

export interface Animal {
...
}

export interface Cat extends Animal{
...
}

export interface Dog extends Animal{
...
}

export interface Iguana extends Animal {
...
}
在一个单独的文件中,我使用以下语法定义了3个异步函数:

const task1 = (() => Promise<Cat[]>) = async () => {
...
}

const task2 = (() => Promise<Dog[]>) = async () => {
...
}

const task3 = (() => Promise<Iguana[]>) = async () => {
...
}

const tasks = [task1, task2, task3];
const runningTasks = tasks.map(task => task());
// below line throws an error
const results = await Promise.all(runningTasks);
consttask1=(()=>Promise)=async()=>{
...
}
const task2=(()=>Promise)=异步()=>{
...
}
const task3=(()=>Promise)=异步()=>{
...
}
const tasks=[task1、task2、task3];
const runningTasks=tasks.map(task=>task());
//下线抛出一个错误
const results=wait Promise.all(运行任务);
最后一行由于类型不兼容而抛出一个错误,它非常长,基本上说“Dog缺少Cat的属性”

我试图做的只是异步调用这3个函数并保存它们的结果

我试图做的只是异步调用这3个函数并保存它们的结果

您有这样的设置:

导出接口动物{
名称:字符串;
}
导出接口Cat扩展了动物{
态度:弦;
}
导出接口狗扩展动物{
睡眠时间:数字;
}
导出接口鬣蜥扩展了动物{
皮肤韧性:数量;
}
const task1=async():Promise=>{
返回等待承诺。解决([]);
}
const task2=async():Promise=>{
返回等待承诺。解决([]);
}
const task3=async():Promise=>{
返回等待承诺。解决([]);
}
一种方法是在
Promise
中使用父类型,如下所示:

const demo = async () => {
    const tasks = [task1, task2, task3];
    const runningTasks: Promise<Animal[]>[] = tasks.map(task => task());
    const results: Animal[][] = await Promise.all(runningTasks);
}

嗨,有趣的是,也许让他们返回基本类型
Animal
?我考虑过这一点,您怀疑错误已经解决,但我不确定这是否真的允许我使用结果中的特定类型,这对我来说很重要。我正在查看
all
的类型签名,问题似乎是它需要一个特定的类型T,传递到函数中的所有值都是相同的类型T,因此它返回一个T[]Hmm另一种选择是为每个输出定义一个具有一个属性的类。最简单的方法可能是断言
runningTasks
是您期望的元组类型:
const runningTasks=tasks.map(task=>task())为[Promise,Promise,Promise]
下面是创建
MapToReturnType
的后续问题/答案,它可以代替
TaskResults
wiith
MapToReturnType
的手动类型创建。
const demo = async () => {
    const tasks = [task1, task2, task3] as const;

    type TaskResults = [
        ReturnType<typeof task1>,
        ReturnType<typeof task2>,
        ReturnType<typeof task3>,
    ];

    const runningTasks = tasks.map(task => task()) as TaskResults;
    const results = await Promise.all(runningTasks);

    results[0][0].attitude;
    results[1][0].sleepDuration;
    results[2][0].skinToughness;
}
const demo = async () => {

    const results = await Promise.all([
        task1(),
        task2(),
        task3()
    ])

    results[0][0].attitude;
    results[1][0].sleepDuration;
    results[2][0].skinToughness;
}