我可以在TypeScript中表达这个高阶函数签名吗?

问题描述 投票:0回答:1

我具有以下功能:

const fn = async (bool, num, str) => {
  // ...
};
  • bool是一个布尔值,
  • num是数字
  • str可选字符串

我还有以下HOF,如果调用者未传递最后一个可选参数,则它允许在调用时填充它。

const hof = (callback) => {
  return async (...args) => {
    if (args.length) {
      const lastArg = args[args.length - 1];
      if ("string" === typeof lastArg) {
        return callback(...args);
      }
    }
    const s = await findString();
    return callback(...[...args].concat(s));
  };
};

这可以写:

const fn = hof(async (bool, num, str) => {
  // str will be valued, either by the caller, or by the hof
});

[我如何完全输入hof,知道它不知道回调的参数(即,它们可能因一种用法而异)?使用TypeScript甚至可以做到吗?

我设法通过泛型处理了返回的类型:

const hof = <R>(
  callback: (...args: any) => Promise<R>
): (...args: any) => Promise<R> => {
  return async (...args) => {
    // ...
  };
};

但是可以输入那些动态参数,以便在使用const fn = hof(async (bool, num, str) => { ... });时,fn仅根据回调参数接受参数吗? fn签名和回调一个之间的唯一区别是,fn允许未定义的str最后一个参数,而回调具有强制性。

未编译,但遵循以下原则:

const hof = <R>(
  callback: (...args: ???, s: string) => Promise<R>
): (...args: ???, s?: string) => Promise<R> => {
  return async (...args) => {
    // ...
  };
};

[仅在我碰到XY problem的情况下,实际使用情况是MySQL transaction management。这种模式允许我在没有连接通过的情况下自动启动一个新事务,或者在调用者的连接已经开始进行事务的情况下使用它的连接。正在讨论此实现here,但简而言之,即我的现实生活hof

const transactional = (run) => async (...args) => {
  if (args.length) {
    const lastArg = args[args.length - 1];
    if (lastArg && "PoolConnection" === lastArg.constructor.name) {
      return run(...args);
    }
  }
  return _transactional(async (connection) => run(...[...args].concat(connection)));
};

如果您正在考虑更好的方法,请大声喊叫;)

我具有以下功能:const fn = async(bool,num,str)=> {// ...}; bool是一个布尔值,num是一个数字str是一个可选字符串我也有以下HOF,它允许...

javascript typescript callback signature higher-order-functions
1个回答
0
投票

我认为您将很难在打字稿中实现这一目标,至少现在很难。我希望能够给出一个正确的答案,但我一直找不到一个好的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.