如何在TypeScript中编写通用的,类型安全的高阶函数?

格里姆

例如,假设我正在编写一个备忘函数,该函数接受一个函数并返回另一个函数。我想利用TypeScript,以便即使我事先不知道输入函数的类型,也可以确保输出函数具有与输入函数相同的类型。这是一些示例代码:

function wrap(fn) {
  return function(...args) {
    return fn(...args);
  };
}

function repeat1(a: string, b: number): string {
  return a.repeat(b);
}

const repeat2 = wrap(repeat1);

不幸的是,repeat2解析为type (...args: any[]) => any我似乎找不到一种wrap将输入类型传播到输出类型的方式来表达功能的方法。

提香·切尔尼科娃·德拉戈米尔

您需要在休息参数和传播表达式中使用泛型和元组

function wrap<A extends any[], R>(fn: (...a: A) => R) {
  return function(...args: A) {
    return fn(...args);
  };
}

function repeat1(a: string, b: number): string {
  return a.repeat(b);
}

const repeat2 = wrap(repeat1); // inferred to const repeat2: (a: string, b: number) => string

上面的版本不适用于通用功能。如果我们放弃任何实现类型的安全性,我们可以创建一个保留通用函数参数的版本(这是可以接受的折衷方案,因为我们可以获得更好的呼叫站点安全性,这一点更为重要)

function wrap<T extends Function>(fn: T): T {
    return function(...args: any[]) :any {
        return fn(...args);
    } as any;
}

wrap(<T>(x: T): T => x)

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在 TypeScript 中编写类型安全的断言函数?

如何在Typescript中为箭头函数创建通用类型

如何在 TypeScript 中接受我的函数的通用返回类型?

如何在 Lua 中编写 sum(f,n) 的高阶函数?

如何在scala中编写通用函数?

在TypeScript中定义类型安全的通用对象访问器函数

通用高阶函数参数类型

如何在Typed Racket中编写以多态函数作为参数的高阶函数?

如何关联在高阶函数之间定义的通用类型?

(TypeScript)如何在通用函数内捕获用户提供的类型?

如何在Scala中编写通用数值函数?

如何在V中编写通用样本函数?

如何在通用Lisp中编写Multf函数

如何在TypeScript中按通用类型过滤类型列表?

如何在 TypeScript 中为泛型类型编写泛型辅助函数?

Typescript推断高阶函数中内部函数的类型

如何在TypeScript中为返回的函数获得类型安全性?

高阶函数如何在 Scala 中工作?

如何在 Jest 中模拟高阶函数

如何在 Swift 中创建高阶函数?

通用高阶函数的不兼容流类型

如何在C#中的通用函数中传递类型

在此示例中,我们如何编写高阶函数?

我如何在 TypeScript 中传递这个通用类型的参数

如何在返回 TypeScript 中 ReactNative 功能组件的高阶函数中使用钩子?

如何在 TypeScript 中定义通用字段复制函数

如何在Typescript中定义和调用通用函数参数?

参数类型依赖时如何在Julia中编写函数

如何在Golang中为多种类型编写函数?