从泛型函数创建泛型类型

皮埃尔-路易斯·拉科尔特

我试图基于另一个泛型类型声明一个泛型类型,但没有成功。

目标是编写我自己的测试框架并根据另一个(方法)键入一些参数。

type Arguments<T> = T extends (...args: infer U) => any ? U : never;

// my custom test method
const methodCall = <T extends (...args: any) => any>(args: {
  method: T;
  response: ReturnType<T>;
  myArguments: Arguments<T>;
}): boolean => {
  const { method, myArguments, response } = args;
  return method.apply(null, myArguments) === response;
};

const test1 = (toto: string) => {
  return toto === "success";
};

// usage of my custom function
methodCall({
  method: test1,
  myArguments: ["fail"],
  response: false
});


// this is what I want to type
interface MyHelpers {
  methodCall: any // HOW TO TYPE THIS? 
  methodCall2: (args: { flag: boolean }) => boolean;
}

// I would expose only the helpers object
const helpers = (): MyHelpers = {
  methodCall: <T extends (...args: any) => any>(args: {
    method: T;
    response: ReturnType<T>;
    myArguments: Arguments<T>;
  }): boolean => {
    const { method, myArguments, response } = args;
    return method.apply(null, myArguments) === response;
  },
  methodCall2: (args: { flag: boolean }): boolean => {
    return args.flag;
  }
};

我期待另一个调用 helpers 的对象能够helpers().methodCall(...)像在 helpers 中声明的那样输入。不与any

操场可以在这里找到

谢谢!

杰夫鲍曼

你很接近,如果我理解正确的话。您可以在函数语法(methodCall定义函数实现时定义的签名)和属性语法(定义methodCall为恰好是 lambda 的属性,这与您拥有它的方式相近)之间进行选择。

如果使用函数语法,则在尖括号 ( <>) 中定义泛型、括号之间的参数列表以及冒号后的返回类型这就好像你在定义一个没有主体的函数。如果您使用属性语法,您就是在定义一个 lambda,泛型在尖括号中,参数列表在圆括号中,返回类型在粗箭头 ( =>) 之后您正在通过该名称定义一个属性,并将您的类型——函数类型——放在冒号之后。无论哪种方式都适合你。

(我还从您的自定义Arguments实用程序类型切换未记录的Parameters内置.)

interface MyHelpers {
  methodCall<T extends (...args: any) => any>(args: {
    method: T;
    response: ReturnType<T>;
    myArguments: Parameters<T>;
  }): boolean;
  methodCall2: (args: { flag: boolean }) => boolean;
}

interface MyHelpersWithObjectSyntax {
  methodCall: <T extends (...args: any) => any>(args: {
    method: T;
    response: ReturnType<T>;
    myArguments: Parameters<T>;
  }) => boolean;
  methodCall2: (args: { flag: boolean }) => boolean;
}

打字稿游乐场

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

创建绑定到整数类型的泛型函数

来自分类Dev

创建具有泛型类型的函数

来自分类Dev

为什么在具有可比约束的泛型函数中丢失泛型类型信息?

来自分类Dev

如何在没有泛型类型参数的情况下定义泛型函数?

来自分类Dev

从泛型函数中泛型类型的 HashSet 返回 HashSet<T>

来自分类Dev

使用C ++ / CLI从泛型函数返回泛型列表

来自分类Dev

泛型函数的泛型错误语法Java 1.7

来自分类Dev

Swift泛型方法应使用重载的泛型函数

来自分类Dev

静态非泛型类中的泛型函数?

来自分类Dev

泛型函数和值类型

来自分类Dev

基于返回类型的Fortran泛型函数

来自分类Dev

泛型函数的TypeScript条件返回类型

来自分类Dev

Julia泛型函数类型参数

来自分类Dev

Scala泛型函数假设类型

来自分类Dev

Swift:检查泛型函数的返回类型

来自分类Dev

实现通用接口的类型的泛型函数

来自分类Dev

泛型类型函数中类型“ something”上不存在属性

来自分类Dev

泛型函数重载

来自分类Dev

Delphi泛型函数

来自分类Dev

泛型函数?

来自分类Dev

Kotlin泛型函数

来自分类Dev

Delphi泛型函数

来自分类Dev

Java泛型-使用泛型函数扩展泛型类

来自分类Dev

创建泛型类型的实例

来自分类Dev

Scala 泛型:使用恢复实际类型来调用另一个泛型函数

来自分类Dev

如何通过传递泛型类型创建多种用途的函数

来自分类Dev

如何在 Swift 泛型函数中创建正确类型的新对象?

来自分类Dev

如何创建泛型方法以返回泛型类型

来自分类Dev

从const泛型类型创建别名类型