TypeScript - 通用函数的 ReturnType 不起作用

Guy*_*uff 5 javascript types typescript

打字稿中有一个名为的功能ReturnType<TFunction>,它允许您推断特定函数的返回类型,如下所示

function arrayOf(item: string): string[] {
  return [item]
}
Run Code Online (Sandbox Code Playgroud)

但是,我在将它与通用函数一起使用时遇到问题:

function arrayOf<T>(item: T): T[] {
  return [item]
}

type R = ReturnType<typeof arrayOf> // R = {}[]
type R = ReturnType<typeof arrayOf<number>> // syntax error
// etc.
Run Code Online (Sandbox Code Playgroud)

使用Typescript ReturnType of generic function的最佳答案,我尝试了这个:(顺便说一句,这不是重复的,它是不同的,因为解决方案和问题确实适用于这种情况)

function arrayOf<T>(x: T): T[] {
  return [x];
}

type GenericReturnType<R, X> = X extends (...args: any[]) => R ? R : never;

type N = GenericReturnType<number, <T>(item: T) => T[]>; // N = never
Run Code Online (Sandbox Code Playgroud)

我还尝试过以下方法:

type GenericReturnType<TGenericParameter, TFunction> = TFunction extends (...args: any[]) => infer R ? R : never;

type N = GenericReturnType<number, <T>(item: T) => T[]>; // N = {}[]
Run Code Online (Sandbox Code Playgroud)

type GenericReturnType<TGenericParameter, TFunction> = TFunction extends <T>(...args: any[]) => infer R ? R : never;

type N = GenericReturnType<number, <T>(item: T) => T[]>; // N = {}[]
Run Code Online (Sandbox Code Playgroud)

type GenericReturnType<TGenericParameter, TFunction> = TFunction extends <T extends TGenericParameter>(...args: any[]) => infer R ? R : never;

type N = GenericReturnType<number, <T>(item: T) => T[]>; // N = {}[]
Run Code Online (Sandbox Code Playgroud)

还有这个

type GenericReturnType<TGenericParameter, TFunction> = TFunction extends (arg: TGenericParameter) => infer R ? R : never;

type N = GenericReturnType<number, <T>(item: T) => T[]>; // N = {}[]
Run Code Online (Sandbox Code Playgroud)

和这个

type GenericReturnType<TGenericParameter, TFunction> = TFunction extends <U extends TGenericParameter>(arg: U) => infer R ? R : never;

type N = GenericReturnType<number, <T>(item: T) => T[]>; // N = {}[]
Run Code Online (Sandbox Code Playgroud)

type x = (<T>(item: T) => T[]) extends <T>(arg: T) => infer R ? R : never // x = {}[]
Run Code Online (Sandbox Code Playgroud)

最后

type x = (<T>(item: T) => T[]) extends (arg: number) => infer R ? R : never // x = {}[]
Run Code Online (Sandbox Code Playgroud)

但它们都没有产生人们非常想要的类型number[]

所以,我的问题是,在给定通用参数的类型的情况下,有没有什么方法可以创建类似于ReturnType内置函数的东西,该函数适用于具有通用参数的函数?(又名上述问题的解决方案)

Max*_*son 3

我和你有同样的问题,在无数次解决方法不起作用之后,我发现了一个有点“黑客”的方法。但是,这可能并不适合所有情况:

与马特给出的答案类似,重点是有一个虚拟函数,但不重写它。不要编写函数的虚拟重写,而是编写一个返回函数的虚拟用法的虚拟函数。然后,使用以下命令获取结果类型ReturnType

function arrayOf<T>(item: T): T[] {
    return [item];
}

const arrayOfNumber = () => arrayOf<number>(1);
type N = ReturnType<typeof arrayOfNumber>;
Run Code Online (Sandbox Code Playgroud)

从TS 3.7开始,除非我没有正确地进行研究,否则如果不找到解决方法,仍然不可能达到预期的结果。希望我们能得到类似这样的东西:

function arrayOf<T>(item: T): T[] {
    return [item];
}

type N = GenericReturnType<typeof arrayOf>; // N<T>
Run Code Online (Sandbox Code Playgroud)