猿问

Promise.allSettled() 响应的类型错误

我最近一直在尝试在 NodeJS 上使用 Promise.allSettled 和 Typescript,但我遇到了响应问题。allSettled 方法返回一个数组和status: "rejected" | "fulfilled"一个值,以防它被满足。问题是,当我尝试访问响应的值时,出现以下错误:


Property 'value' does not exist on type 'PromiseSettledResult<unknown>'.

Property 'value' does not exist on type 'PromiseRejectedResult'.ts(2339)

下面我将留下一个简单的示例,您可以复制代码并自己尝试:


const p1 = Promise.resolve(50); 

const p2 = Promise.resolve(100); 


const promiseArray = [p1, p2]; 

  

Promise.allSettled( promiseArray ). 

  then( results => results.forEach( result =>  

    console.log(result.status, result.value)));

如果我在我的项目上运行这段代码,我会得到一个错误,因为result.value在最后。


我在 Windows 版本 12.18.3 上运行我的节点,并且我已经将我的目标设置为tsconfig.json能够ES2020使用该方法本身。


叮当猫咪
浏览 647回答 4
4回答

HUWWW

在过滤器承诺数组的情况下出现相同的错误:const promises = ids.map((id) => <some BE API call>);const resolvedPromises = await Promise.allSettled(promises);resolvedPromises.filter(({ status }) => status === 'fulfilled').map((p) => p.value);错误截图问题是allSettledreturns PromiseSettledResult,它根本没有导出(我在 lib.es2020.promise 中使用tsconfig):interface PromiseFulfilledResult<T> {&nbsp; &nbsp; status: "fulfilled";&nbsp; &nbsp; value: T;}interface PromiseRejectedResult {&nbsp; &nbsp; status: "rejected";&nbsp; &nbsp; reason: any;}type PromiseSettledResult<T> = PromiseFulfilledResult<T> | PromiseRejectedResult;并且.map不明白所有的rejected承诺都在filtered方法中被过滤了。所以,我什至无法导入类型并将值转换为它们。作为临时解决方案,我用注释抑制了 ESLint 和 TSC 规则:&nbsp; // eslint-disable-next-line @typescript-eslint/ban-ts-comment&nbsp; // @ts-ignore然后我PromiseFulfilledResult在项目中创建了相同的接口并使用了类型转换:resolvedPromises.filter(({ status }) => status === 'fulfilled').map((p) => (p as PromiseFulfilledResult).value);结果我摆脱了 on error 和 ESLint/TS rules ignoring comments。

弑天下

你只有一个状态满足的值属性,而你没有检查它。所以使用我自己的例子,它可以固定如下:const p1 = Promise.resolve(50);&nbsp;const p2 = Promise.resolve(100);&nbsp;const promiseArray = [p1, p2];&nbsp;&nbsp;&nbsp;Promise.allSettled( promiseArray ).&nbsp;&nbsp; then( results => results.forEach( result =>&nbsp;&nbsp;&nbsp; &nbsp; console.log(result.status,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result.status === 'fulfilled' && result.value&nbsp; &nbsp; );&nbsp; ));它现在验证承诺是否已实现,然后打印值(如果是的话)。

qq_花开花谢_0

如果在调用该方法后进行类型声明,则可以避免此错误allSettled。例如,您可以立即为打字稿输入一个类型,如下所示:const promises = await Promise.allSettled([&nbsp; fetch(url).then((response) => response.json()),&nbsp; fetch(url).then((response) => response.json()),]) as {status: 'fulfilled' | 'rejected', value: SomeType}[];之后它将正常工作:const resolvedPromises = promises.filter(({ status }) => status === 'fulfilled');const responses = resolvedPromises.map((promise) => promise.value);

开心每一天1111

您可以只键入 cast 的结果Promise.allSettled,例如:const [&nbsp; &nbsp; &nbsp; someData,&nbsp; &nbsp; &nbsp; otherData&nbsp; &nbsp; ] = (await Promise.allSettled([&nbsp; &nbsp; &nbsp; this.someRepository.count(),&nbsp; &nbsp; &nbsp; this.otherRepository.count(),&nbsp; &nbsp; ])) as PromiseFulfilledResult<number>[];&nbsp;// will verify the promises, but ts doesn't get it&nbsp;this.verify(someData, otherData)&nbsp;console.log(otherData.value) // ts is okayNumber 是从 promise 返回的类型,如果你想用不同的类型输入 promises,你也可以使用[PromiseFulfilledResult<number>, PromiseFulfilledResult<string>]
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答