V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
june4
V2EX  ›  TypeScript

TypeScript 怎么 wrap 一个函数并修改一下返回值?

  •  
  •   june4 · 219 天前 · 1568 次点击
    这是一个创建于 219 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如说,

    declare function get<T>(): T
    declare function wrap<T extends () => any>(fn: T):
      (...args: Parameters<T>) => ReturnType<T> | undefined
    
    // 这里这个 f 的签名和传进的不同啊,成了 () => unknown
    let f = wrap(get)
    

    除非 wrap 这么定义:

    declare function wrap<T extends () => any>(fn: T): T
    

    这样倒完美了,但是修改不了返回值了

    7 条回复    2024-04-22 16:29:25 +08:00
    tyx1703
        1
    tyx1703  
       219 天前 via iPhone
    declare function wrap<T, F extends typeof get<T>, P extends Parameters<F>>(fn: F): <T extends ReturnType<F>(…args: P) => T | undefined
    june4
        2
    june4  
    OP
       219 天前
    @tyx1703 这里的被包装函数是任意函数,不只是 get 。
    Sayuri
        3
    Sayuri  
       219 天前
    ```ts
    function wrap<F extends (...args: any[]) => any>(fn: F): (...args: Parameters<F>) => DoSomething<ReturnType<F>> {
    return fn;
    }
    ```
    tyx1703
        4
    tyx1703  
       219 天前 via iPhone
    declare function wrap<T extends (…args: any[]) => any, R extends ReturnType<F>>(fn: T):
    (...args: Parameters<T>) => R | undefined
    Pencillll
        5
    Pencillll  
       219 天前   ❤️ 2
    这样写就行了:

    declare function wrap<T extends any[], R>(fn: (...args: T) => R): (...args: T) => R | undefined

    为什么 op 的定义不行,我的理解是在用 Parameters<T>和 ReturnType<T>提取函数里的类型时,会解除函数的上下文,所以函数的泛型参数也就丢失掉了

    参考: https://github.com/Microsoft/TypeScript/pull/30215
    cheese
        6
    cheese  
       219 天前
    弱弱的问一下,java 或者其他语言会遇到开发的时候,会遇到 ts 这种,连类型定义也成为开发难度的一部分这种问题吗?
    ceeeeeeeeeeeeeeb
        7
    ceeeeeeeeeeeeeeb  
       219 天前
    ts 建议还是弃了吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5101 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:41 · PVG 13:41 · LAX 21:41 · JFK 00:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.