为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

叮当猫咪 2023-02-17 10:26:44
我最近一直在尝试在 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使用该方法本身。
查看完整描述

4 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

在过滤器承诺数组的情况下出现相同的错误:


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> {

    status: "fulfilled";

    value: T;

}


interface PromiseRejectedResult {

    status: "rejected";

    reason: any;

}


type PromiseSettledResult<T> = PromiseFulfilledResult<T> | PromiseRejectedResult;

并且.map不明白所有的rejected承诺都在filtered方法中被过滤了。


所以,我什至无法导入类型并将值转换为它们。


作为临时解决方案,我用注释抑制了 ESLint 和 TSC 规则:


  // eslint-disable-next-line @typescript-eslint/ban-ts-comment

  // @ts-ignore

然后我PromiseFulfilledResult在项目中创建了相同的接口并使用了类型转换:


resolvedPromises.filter(({ status }) => status === 'fulfilled').map((p) => (p as PromiseFulfilledResult).value);

结果我摆脱了 on error 和 ESLint/TS rules ignoring comments。


查看完整回答
反对 回复 2023-02-17
?
弑天下

TA贡献1818条经验 获得超8个赞

你只有一个状态满足的值属性,而你没有检查它。


所以使用我自己的例子,它可以固定如下:


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.status === 'fulfilled' && result.value

    );

  ));

它现在验证承诺是否已实现,然后打印值(如果是的话)。


查看完整回答
反对 回复 2023-02-17
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

如果在调用该方法后进行类型声明,则可以避免此错误allSettled。例如,您可以立即为打字稿输入一个类型,如下所示:


const promises = await Promise.allSettled([

  fetch(url).then((response) => response.json()),

  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);


查看完整回答
反对 回复 2023-02-17
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

您可以只键入 cast 的结果Promise.allSettled,例如:


const [

      someData,

      otherData

    ] = (await Promise.allSettled([

      this.someRepository.count(),

      this.otherRepository.count(),

    ])) as PromiseFulfilledResult<number>[];


 // will verify the promises, but ts doesn't get it

 this.verify(someData, otherData)


 console.log(otherData.value) // ts is okay

Number 是从 promise 返回的类型,如果你想用不同的类型输入 promises,你也可以使用[PromiseFulfilledResult<number>, PromiseFulfilledResult<string>]


查看完整回答
反对 回复 2023-02-17
  • 4 回答
  • 0 关注
  • 631 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信