如何约束 Promise 实例的 catch 语句的回调函数的参数的类型?

2022-12-01 10:25:08 +08:00
 daguaochengtang
```
function foo() {
const p: Promise<number> = new Promise((res, rej) => {
const n = Math.random()
n > 0.5 ? res(n) : rej(new Error(n))
})
return p
}
foo().then(n => {}).catch((error) => {
// 这里 error 的类型是 any ,怎么在 foo 函数上做约束,使得每次调用 foo()的时候,这里的 error 有我想要的类型?
})
```
如上代码,如何约束?
1117 次点击
所在节点    问与答
10 条回复
gouflv
2022-12-01 10:58:52 +08:00
TS 目前还没有 Java 一样的 Throw 声明,所以需要自己手动判断错误类型再处理
Trim21
2022-12-01 11:06:24 +08:00
catch 块只能是 unknown 或者 any 类型,不能是其他类型。

我记忆中曾经有过一段时间,Promise 这个泛型类型可以接受第二个参数作为 reject 的 error 类型?
optional
2022-12-01 11:07:44 +08:00
checked exception javar 都不喜欢用,你还想把它捡起来。。。
Trim21
2022-12-01 11:09:09 +08:00
@gouflv 这个主要是因为 js 可以随便 throw ,catch 只能 catch 所有的 throw ,不能针对一个特定类型进行 catch 。所以 ts 也不支持指定 catch 的类型。
retrocode
2022-12-01 11:18:55 +08:00
如果是团队内的业务代码的话, 可以考虑自定义一个 eslint 规则做约束, 挺方便的, 不是很难, 依赖就没办法了
rabbbit
2022-12-01 11:41:18 +08:00
daguaochengtang
2022-12-01 13:42:43 +08:00
@retrocode 就是业务代码,这个能稍微展开讲讲怎么做吗?
daguaochengtang
2022-12-01 13:43:20 +08:00
@rabbbit 谢谢,果然是万 V 友
daguaochengtang
2022-12-01 14:09:09 +08:00
@Trim21 这个是历史上有提案没有成为标准吗,还是被废弃了,知道可以在哪里查看相关的文档吗?
Trim21
2022-12-01 14:55:16 +08:00
@daguaochengtang 大概率只是我记错了,我在 playground 看了一下 tsv3v4 都没有第二个参数。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/899260

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX