Typescript:转换所有函数参数的通用函数类型

标签 typescript typescript-typings type-inference typescript-generics

在我的项目中,我使用名为 Data<X> 的泛型类型 正在转换给定类型 X 以某种方式。

现在我想创建一个通用函数类型 DataFunction<F extends Function> 包装了 F 的所有参数 Data<Parameter>

例如我想要

DataFunction<(a: Type1, b: Type2) => ReturnType>

结果

(a: Data<Type1>, b: Data<Type2>) => ReturnType

我用它来转换已知数量的参数,这里将第一个参数包装在 Data<Parameter>,保留以下内容不变:

type DataFunction<T extends (arg0: any, ...args: any[]) => any>  
    = T extends (arg0: infer A, ...args: infer P) => infer R  
        ? (arg0: Data<A>, ...args: P) => R  
        : any;

我的问题是,如何将以下所有参数包装在 Data<Paramter>?我想要这样的东西,但不起作用:

type DataFunction<T extends (arg0: any, ...args: any[]) => any>  
    = T extends (arg0: infer A, ...args: [infer P]) => infer R  
    ? (arg0: Data<A>, ...args: [Data<P>]) => R 
    : any;

最佳答案

这似乎有效:

type DataFunction<F> = F extends (...args: infer A) => infer R
  ? (...args: { [K in keyof A]: Data<A[K]> }) => R
  : any;

PG

关于Typescript:转换所有函数参数的通用函数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58296449/

相关文章:

clojure - 为什么 Clojure 无法推断出这个 def 类型?

typescript - 有没有办法手动将技能连接到 Microsoft 虚拟助手?无需运行 botskills 连接

reactjs - 相当于 PropTypes.arrayOf 的 TypeScript 声明是什么?

javascript - 检查接口(interface)是否有属性?

typescript 通用联合类型

haskell - 什么是单态性限制?

javascript - 如何停止 array.filter() 函数

javascript - 单击(单击)时 Angular 6 更改最近的图标

node.js - 根据环境使用凭据初始化 Admin SDK

generics - 为什么编译器会将两个具有不同名称的等效签名的泛型类型变量识别为不同类型?