Typescript 承诺#捕获被拒绝处理程序的打字脚本签名
我注意到中的Typescript 承诺#捕获被拒绝处理程序的打字脚本签名,typescript,promise,Typescript,Promise,我注意到中的Promise#catch的标准键入定义为 interface Promise<T> { catch(onrejected?: (reason: any) => T | PromiseLike<T>): Promise<T>; catch(onrejected?: (reason: any) => void): Promise<T>; } 根本不涉及 es6.shim-d-ts中的第二个重载签名也是如此,据我所知,
Promise#catch
的标准键入定义为
interface Promise<T> {
catch(onrejected?: (reason: any) => T | PromiseLike<T>): Promise<T>;
catch(onrejected?: (reason: any) => void): Promise<T>;
}
根本不涉及
es6.shim-d-ts
中的第二个重载签名也是如此,据我所知,它在编译到ES5的环境中被大量使用,是不必要的还是不可取的?嗯,T
可以是void
,这意味着您的用例已经得到了支持
如果您执行了T | PromiseLike | void
操作,则输出可能是一个Promise
,该问题通过void
解决,这将是一个类型错误
请注意,在这些定义中,承诺不是静态类型的。签名实际上更难,因为
reason
是键入的any
。这就像大多数运动未检查异常的语言(如C#),不像Java和Swift,Java和Swift具有已检查异常(函数签名的一部分是它可能抛出的)。你是说它实际上应该是catch(onrejected?:(原因:any)=>void):Promise
?我不确定T
从何而来。或者它可能真的应该是接收方承诺的类型参数和回调返回类型之间的联合,但这可能太复杂了。@Bergi T是承诺的通用参数-它可以是任何东西,约束使它在链中保持不变。我是说,如果我们想准确地知道S代表拒绝,那么它实际上应该是Promise
,然后应该是::Promise->((T->Promise | S)|未定义)| E->Promise | S)|未定义)->Promise `它仍然不准确,但更“安全”——显然这对我们自己的利益来说太复杂了:)@Bergi(谈到我在写回复时没有看到的第二条评论)是的,typescript会支持类似于Promise
的东西吗?
catch(onrejected?: (reason: any) => T | PromiseLike<T> | void): Promise<T>;
catch<U>(onRejected?: (error: any) => U | Thenable<U>): Promise<U>;