包装泛型函数

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

有没有办法将泛型函数包装在类中并保留泛型?

这是我的想法:

const func = <G extends string>(p: G) => p;

class Func<A extends any[], R> {
  constructor(private readonly func: (...args: A) => R) {}

  public call(...args: A): R {
    return this.func(...args);
  }

  public catch(cb: (error: unknown) => void) {}

  // more methods ...
}

现在如果我使用它,泛型显然会丢失:

const use = new Func(func); // =>  Func<[p: any], any>

我已经尝试过这个,它保留了整个函数类型:

class Func<F extends (...args: A) => R, A extends any[], R> {
  constructor(private readonly func: F) {}

  public call(...args: A): R {
    return this.func(...args);
  }

  public catch(cb: (error: unknown) => void) {}
}

但即便如此,如果我尝试使用

call
方法,泛型(甚至参数类型)也会丢失:

use.call('str'); // => any

总结一下: 我需要一种方法将泛型函数包装在类中并为类方法保留其泛型。我愿意接受任何创造性的解决方法。

typescript function class generics
1个回答
0
投票

只需使用构造函数参数作为泛型类一:

游乐场

const func = <G extends string>(p: G) => p;

type Callback = (...args: any[]) => any;

class Func<T extends Callback> {
  constructor(private readonly func: T) {}

  public call(...args: Parameters<T>): ReturnType<T> {
    return this.func(...args);
  }

  public catch(cb: (error: unknown) => void) {}

  // more methods ...
}


const use = new Func(func); // =>  Func<[p: any], any>

const t = use.call('string'); // t: string;
© www.soinside.com 2019 - 2024. All rights reserved.