V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
daguaochengtang
V2EX  ›  问与答

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

  •  
  •   daguaochengtang · 61 天前 · 642 次点击
    这是一个创建于 61 天前的主题,其中的信息可能已经有所发展或是发生改变。
    ```
    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 有我想要的类型?
    })
    ```
    如上代码,如何约束?
    10 条回复    2022-12-01 14:55:16 +08:00
    gouflv
        1
    gouflv  
       61 天前
    TS 目前还没有 Java 一样的 Throw 声明,所以需要自己手动判断错误类型再处理
    Trim21
        2
    Trim21  
       61 天前 via Android
    catch 块只能是 unknown 或者 any 类型,不能是其他类型。

    我记忆中曾经有过一段时间,Promise 这个泛型类型可以接受第二个参数作为 reject 的 error 类型?
    optional
        3
    optional  
       61 天前 via iPhone
    checked exception javar 都不喜欢用,你还想把它捡起来。。。
    Trim21
        4
    Trim21  
       61 天前 via Android
    @gouflv 这个主要是因为 js 可以随便 throw ,catch 只能 catch 所有的 throw ,不能针对一个特定类型进行 catch 。所以 ts 也不支持指定 catch 的类型。
    retrocode
        5
    retrocode  
       61 天前
    如果是团队内的业务代码的话, 可以考虑自定义一个 eslint 规则做约束, 挺方便的, 不是很难, 依赖就没办法了
    daguaochengtang
        7
    daguaochengtang  
    OP
       60 天前
    @retrocode 就是业务代码,这个能稍微展开讲讲怎么做吗?
    daguaochengtang
        8
    daguaochengtang  
    OP
       60 天前
    @rabbbit 谢谢,果然是万 V 友
    daguaochengtang
        9
    daguaochengtang  
    OP
       60 天前
    @Trim21 这个是历史上有提案没有成为标准吗,还是被废弃了,知道可以在哪里查看相关的文档吗?
    Trim21
        10
    Trim21  
       60 天前 via Android
    @daguaochengtang 大概率只是我记错了,我在 playground 看了一下 tsv3v4 都没有第二个参数。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   实用小工具   ·   1952 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 04:48 · PVG 12:48 · LAX 20:48 · JFK 23:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.