typescript - 带有函数参数作为参数传递的泛型函数

标签 typescript generics

我正在尝试实现一个小型缓存功能。虽然我的实现似乎有效,但我很难在其中定义正确的类型。

type Producer<T> = (...args: any[]) => Promise<T>;

export function cache<T>(producer: Producer<T>): Producer<T> {
  let cached;
  return async function(...args: any[]): Promise<T> {
    if (!cached) {
      cached = await producer.apply(null, args);
    }
    return cached;
  };
}

是的,我仍然需要改进它,以便根据传递的参数缓存该值,但这是一个小且易于修复的问题。

在这种情况下,

a Producer 是一个可以生成可缓存值的函数,并且只能被调用一次。 cache() 返回一个函数,该函数应该具有与传递给 cache() 函数的生产者匹配的参数。现在,如果您知道要传递哪些参数,那么现在就可以正常工作,但这是 TypeScript,所以我希望编译器能够验证类型。我只是不知道如何定义返回的函数应该具有与生产者相同的参数。我知道 TS 中有所有这些实用程序类型,但我不知道在这种情况下如何使用它们。

最佳答案

您可以使用Parameters提取生产者函数参数类型的实用程序:

function cache<T, TProducer extends Producer<T>>(producer: TProducer): TProducer {
  let cached: Promise<T>;
  const wrapper = (...args: Parameters<TProducer>): Promise<T> => {
    if (!cached) {
      cached = producer(...args);
    }
    return cached;
  };

  return wrapper as TProducer;
}

Playground


关于typescript - 带有函数参数作为参数传递的泛型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60665887/

相关文章:

angular - Atom 需要很多时间来编译 angular 2 的 typescript 文件

java - 我还必须做什么才能让我的方法处理任何类型的对象

generics - 编译器覆盖 F# 中的类型定义(泛型)

java - POJO 对象的 JAX-RS 通用工厂

java - 遍历 java 中的通用 HashMap

javascript - 混合 Node 的 CommonJS 和 Typescript 的 ES 模块

javascript - Angular Material Moment.js 格式化

c# - Reflection.Emit 创建通用继承方法

javascript - 使用 typescript 和 webpack 进行代码拆分

Typescript 声明文件在 VSCode 中给我错误