Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 承诺#捕获被拒绝处理程序的打字脚本签名_Typescript_Promise - Fatal编程技术网

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