TypeScript 在 Promise.allSettled().forEach() 处理后为解析值设置类型“never”

问题描述 投票:0回答:1

TypeScript 在 Promise.allSettled(promises).forEach(results) 之后给我一个“从不”类型?

type myValue = {
        test1: string;
        test2: string;
        test3: string;
    } | undefined;


const go = async () => {

    // the values
    let value: myValue = undefined;
    let value2: myValue = undefined;

    // do some async requests
    const results = await Promise.allSettled([
        Promise.resolve({test1: 'test1.1', test2: 'test2.1', test3: 'test3.1'}),
        Promise.resolve({test1: 'test1.2', test2: 'test2.2', test3: 'test3.2'}),
    ]);

    // process results
    results.forEach( (result, index) => {
        if( result.status === "fulfilled") {
            if( index === 0 ) {
                // set value
                value = result.value;
            }
            if( index === 1 ) {
                // set value
                value2 = result.value;
            }
        }
        if( result.status === "rejected") {
            // process error
            console.error("error", result.reason);
        }
    });

    // checking if value is set
    if( !value || !value2 ) {
        throw new Error("no Value found");
    }

    // with TypeScript errors
    console.log("the type given is 'never', but value.test1 is set:", value.test1);
    console.log("the type given is 'never', but value2.test3 is set:", value2.test3);
}

go();

TS游乐场:参观

我已经尝试过:

  • 评论:@ts-ignore / @ts-expect-error /等,但我不想这样做,因为我需要很多。
  • 类型转换:值=值作为MyValue;也会使错误消失,但这里不需要

为什么 TypeScript 不在这里推断类型?

typescript foreach promise type-inference typescript-never
1个回答
0
投票

在内部,TypeScript 将

value
value2
的值“存储”为
undefined
,即使类型是
MyValue
。由于 TypeScript 认为它是
undefined
并且您不重新分配它 在该范围内 当您执行检查
!value || !value2
时,TypeScript 仍然认为它是未定义的。因为 TypeScript 认为它是未定义的,所以它推断出这个条件将始终为真,因此下面的
value
value2
可以“
never
”运行。至少,编译器是这么认为的。

是的,您实际上稍后会重新分配值,但编译器还看不到这一点。

实际上你有一个非常简单的方法来修复它 - 只需删除

undefined
的显式初始值:

let value: MyValue;
let value2: MyValue;

游乐场

© www.soinside.com 2019 - 2024. All rights reserved.