代码之家  ›  专栏  ›  技术社区  ›  notrota

TypeScript-泛型函数的ReturnType不工作

  •  2
  • notrota  · 技术社区  · 6 年前

    typescript中有一个称为 ReturnType<TFunction> 它允许您推断特定函数的返回类型,如下所示

    function arrayOf(item: string): string[] {
      return [item]
    }
    

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

    function arrayOf<T>(item: T): T[] {
      return [item]
    }
    
    type R = ReturnType<typeof arrayOf> // R = {}[]
    type R = ReturnType<typeof arrayOf<number>> // syntax error
    // etc.
    

    使用来自 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
    

    我还尝试了以下方法:

    type GenericReturnType<TGenericParameter, TFunction> = TFunction extends (...args: any[]) => infer R ? R : never;
    
    type N = GenericReturnType<number, <T>(item: T) => T[]>; // N = {}[]
    

    以及

    type GenericReturnType<TGenericParameter, TFunction> = TFunction extends <T>(...args: any[]) => infer R ? R : never;
    
    type N = GenericReturnType<number, <T>(item: T) => T[]>; // N = {}[]
    

    type GenericReturnType<TGenericParameter, TFunction> = TFunction extends <T extends TGenericParameter>(...args: any[]) => infer R ? R : never;
    
    type N = GenericReturnType<number, <T>(item: T) => T[]>; // N = {}[]
    

    还有这个

    type GenericReturnType<TGenericParameter, TFunction> = TFunction extends (arg: TGenericParameter) => infer R ? R : never;
    
    type N = GenericReturnType<number, <T>(item: T) => T[]>; // N = {}[]
    

    还有这个

    type GenericReturnType<TGenericParameter, TFunction> = TFunction extends <U extends TGenericParameter>(arg: U) => infer R ? R : never;
    
    type N = GenericReturnType<number, <T>(item: T) => T[]>; // N = {}[]
    

    以及

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

    最后

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

    但没有一个能满足人们的需求 number[]

    所以,我的问题是,有没有办法创造出类似于 ReturnType 在给定泛型参数类型的情况下,哪种方法适用于具有泛型参数的函数?(也就是上述问题的解决方案)

    1 回复  |  直到 6 年前
        1
  •  1
  •   Matt McCutchen    6 年前

    给定函数的类型参数,而不是当前的类型参数 Getting the return type of a function which uses generics . 给定参数类型,可以编写一个非泛型伪函数,传递这些类型的参数,然后检查其返回类型:

    function dummy(n: number) { return arrayOf(n); }
    type N = ReturnType<typeof dummy>;