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

287 天前
 june4

比如说,

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

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

1897 次点击
所在节点    TypeScript
7 条回复
tyx1703
287 天前
declare function wrap<T, F extends typeof get<T>, P extends Parameters<F>>(fn: F): <T extends ReturnType<F>(…args: P) => T | undefined
june4
287 天前
@tyx1703 这里的被包装函数是任意函数,不只是 get 。
Sayuri
287 天前
```ts
function wrap<F extends (...args: any[]) => any>(fn: F): (...args: Parameters<F>) => DoSomething<ReturnType<F>> {
return fn;
}
```
tyx1703
287 天前
declare function wrap<T extends (…args: any[]) => any, R extends ReturnType<F>>(fn: T):
(...args: Parameters<T>) => R | undefined
Pencillll
287 天前
这样写就行了:

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
287 天前
弱弱的问一下,java 或者其他语言会遇到开发的时候,会遇到 ts 这种,连类型定义也成为开发难度的一部分这种问题吗?
ceeeeeeeeeeeeeeb
287 天前
ts 建议还是弃了吧

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

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

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

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

© 2021 V2EX