TypeScript 中,Promise 的 reject 无法使用类型推导吗?-灵析社区

HAO起起

#### 遇到一个 `TypeScript` 中有关 `Promise` 的类型推导问题: 以下代码中,`resolve` 会有明确的类型限制,但 `reject` 却没有,想知道如何才能做到? type P1 = Promise; const p1: P1 = new Promise((resolve, reject) => { // Expected 1 arguments, but got 0. Did you forget to include 'void' in your type argument to 'Promise'?ts(2794) resolve(); resolve(1); // Argument of type 'string' is not assignable to parameter of type 'number | PromiseLike'.ts(2345) resolve("str"); reject(); reject(123); reject("str"); }); ![image.png](https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241012/bb39482eb9d6bfabbcc2882170fd5e0a.png) #### 查看 `Promise` 的类型声明 ![image.png](https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241012/388d99ec4a96cdba11420631d3201307.png) 只有一个泛型参数,貌似不支持。 找到了这篇文章,文章的结论是:**无法定义,也无需定义。** [Typescript 中 Promise reject 的类型该如何定义?](https://link.segmentfault.com/?enc=AJ9XaoGxvrAtYShtThPgpw%3D%3D.ZB4Tu8VkSGlSGuVbLpAVCVLQ2CSKk1st19kHbaMpYSgAK9tNH9hHXniteQW2G4HgnwCd3MChcgUbCxhzA%2FifyE99cIhvkhRqGD10ayFTh0XkTeGK%2BZYLE8mJ6Bn3y0P4) 希望 `reject` 也能有明确的类型推导,但貌似原理上不可行。 那么,在处理 `catch` 的时候,编辑器报出来的 `any`,应该怎么处理比较优雅呢? p1.catch((err: any) => {}) 除了在这里直接声明,还有什么最佳实践吗?

阅读量:206

点赞量:0

问AI
这个是设计如此吧,毕竟你确实可能不知道会 catch 到什么错误 不过好像可以包装一个确定错误类型的 "PromiseE" type Nullable = T | null | undefined type MaybePromiseLike = T | PromiseLike class PromiseE extends Promise { constructor(executor: (resolve: (value: T | PromiseLike) => void, reject: (reason?: E) => void) => void) { super(executor) } catch(onrejected?: ((reason: E) => R | PromiseLike) | undefined | null): Promise { return super.catch(onrejected) } } const p = new PromiseE((res, rej) => { res(1) // @ts-expect-error rej(2) rej('3') }) p.catch(err => { err // err: string })