我有一个类A,它有函数f (可能被子类覆盖)。
我想定义一个函数,g,这样g(cls, ...args)只能在cls是A的子类并且args匹配cls.f的类型签名时才能工作。有办法这样做吗?
编辑:我修改了上面的内容,以反映g的第一个参数实际上是A子类的构造函数,而不是实例。
发布于 2018-12-22 01:22:57
当然,您可以使用休息/传播类型的元组实现这一点,因为TS3.0:
declare class A {
f(...args: any[]): any;
}
declare function g<T extends A>(val: T, ...args: Parameters<T['f']>): void;
declare class B extends A {
f(x: string, y: number): boolean;
}
declare const b: B;
g(b, "hey", 123); // okay
g(b, 123, "hey"); // error元组rest/spread推理隐藏在Parameters类型函数中,在标准库中定义为:
type Parameters<T extends (...args: any[]) => any> =
T extends (...args: infer P) => any ? P : never;这就是你要找的吗?
编辑:如果val应该是一个构造函数,那么您可以这样做:
declare function g<T extends A>(
val: new(...args:any[])=>T,
...args: Parameters<T['f']>
): void;
declare class B extends A {
f(x: string, y: number): boolean;
}
g(B, "hey", 123); // okay
g(B, 123, "hey"); // error或者本质上是一样的:
declare function g<T extends new (...args: any[]) => A>(
val: T,
...args: Parameters<InstanceType<T>['f']>
): void;取决于您希望T是构造函数类型还是实例类型。
https://stackoverflow.com/questions/53892341
复制相似问题