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游乐场:参观
我已经尝试过:
为什么 TypeScript 不在这里推断类型?
在内部,TypeScript 将
value
和 value2
的值“存储”为 undefined
,即使类型是 MyValue
。由于 TypeScript 认为它是 undefined
并且您不重新分配它 在该范围内 当您执行检查 !value || !value2
时,TypeScript 仍然认为它是未定义的。因为 TypeScript 认为它是未定义的,所以它推断出这个条件将始终为真,因此下面的 value
和 value2
可以“never
”运行。至少,编译器是这么认为的。
是的,您实际上稍后会重新分配值,但编译器还看不到这一点。
实际上你有一个非常简单的方法来修复它 - 只需删除
undefined
的显式初始值:
let value: MyValue;
let value2: MyValue;