我注意到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>;
}
我想知道为什么这是用这种方式写的,而不是
catch(onrejected?: (reason: any) => T | PromiseLike<T> | void): Promise<T>;
Nate Archibald的其他文件es6-promise.d.ts
给出了
catch<U>(onRejected?: (error: any) => U | Thenable<U>): Promise<U>;
根本没有提到<T>
。
es6.shim-d-ts
中的第二个重载签名也是如此,据我所知,在编译到ES5环境中大量使用,不必要/不合需要?
答案 0 :(得分:2)
好吧,T
可以是void
,这意味着您的用例已经受到支持。
如果您T | PromiseLike<T> | void
输出的输出可能是Promise<string>
,则void
解决了reason
这可能是类型错误。
请注意,在这些定义中,承诺不会以强有力的方式静态输入。由于any
已键入/build
,因此签名实际上更难。这就像大多数语言(如C#)一样运行未经检查的异常,而不像Java和Swift那样具有检查异常(函数签名的一部分就是它可能抛出的东西)。