实现泛型函数时将类型参数转发给泛型类型

Forward type parameters to generic type when implementing generic function

假设我得到了这样的函数类型。我已经可以实现那个类型的函数了,不需要再声明参数或者 return 类型:

type MyFunc = (args: string) => boolean;

// TS knows args is a string and return is boolean 
const myFunc: MyFunc = (args) => true;

但是,假设我得到了一个通用函数类型。我想实现一个遵循这种类型的函数,但将泛型类型参数转发给调用者。这可能吗?我的尝试给出了一个错误:

type ReturnsSomething<A> = (args: A) => A;

// Generic type 'ReturnsSomething' requires 1 type argument(s).ts(2314)
const logAndReturnSomething: ReturnsSomething = (args) => {
  console.log(args);
  return args;
};

logAndReturnSomething<string>('asdf');

这也不行:


type ReturnsSomething<A> = (args: A) => A;

// Cannot find name 'A'.ts(2304)
const logAndReturnSomething: ReturnsSomething<A> = (args) => {
  console.log(args);
  return args;
};

logAndReturnSomething<string>('asdf');

在更复杂的情况下,我不想在我的所有实现中重新定义 args 和 return 类型,因为这违背了可共享 ReturnsSomething 泛型的目的。有什么方法可以实现将其类型参数转发给泛型类型的泛型函数吗?

我可以创建一个包装函数来强制执行此类型,但这意味着我需要在每次使用时调用双重函数,我希望有一种更简洁的方法:

type ReturnsSomething<A> = (args: A) => A;

function makeLogAndReturnSomething<A>(): ReturnsSomething<A> {
  return (args) => {
    console.log(args);
    return args;
  };
}

makeLogAndReturnSomething<string>()('asdf');

我正在使用 typescript 4.6 的价值,不确定 4.7 是否会解决这个问题,或者我是否缺少一些 TS 语法。

试试这个:

type GenericFn = <A>(args: A) => A;

const logAndReturnSomething: GenericFn = (args) => {
  console.log(args);
  return args;
};

const result = logAndReturnSomething('asdf'); //infers return type as string

本质上,我们不是在创建一个泛型类型,而是一个泛型函数。我知道这很混乱:)

有一个很棒的短片youtube video如果你想深入挖掘。

TS Playground