更改第一个参数类型的增强函数?

Enhancer function that changes the type of the first parameter?

这是一个高阶 logFunctionName 函数,它通过记录函数名称来增强 say。增强的 enhancedSay 函数采用与原始 say 函数相同的参数。

function say(msg: string | number) {
  console.log(msg)
}

function logFunctionName<T extends (...args: any[]) => any>(func: T): (...funcArgs: Parameters<T>) => ReturnType<T> {
  return (...args: Parameters<T>): ReturnType<T> => {
    console.log(func.name)
    return func(...args);
  };
}

const enhancedSay = logFunctionName(say)("hello");

// const enhancedSay2 = messageLength(say)("hello");
// => 5

现在我遇到了一个问题。

我如何编写一个高阶 messageLength 函数,通过将传递给它的第一个参数从字符串转换为表示字符串长度的数字来增强 say。增强的 enhancedSay2 函数接受一个字符串,而原始的 say 函数接受一个数字。

编辑:这是一个简化的例子。我真正想做的是创建一个高阶函数,它接受一个字符串,将这个字符串注入 DOM 并将一个元素传递给增强函数。

我不会在函数类型中使函数通用,但在其参数类型和 return 类型中,这应该给 fiddle:

一些空间
function messageLength<P extends any[], R>(func: (len: number, ...args:T) => R): (msg: string, ...args: P) => R {
  return (msg, ...args) => {
    return func(msg.length, ...args);
  };
}