有没有办法将泛型函数包装在类中并保留泛型?
这是我的想法:
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
总结一下: 我需要一种方法将泛型函数包装在类中并为类方法保留其泛型。我愿意接受任何创造性的解决方法。
只需使用构造函数参数作为泛型类一:
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;