我显然希望允许它引用实现而不是抽象本身,而仍然仅依赖抽象接口定义。
答案 0 :(得分:2)
您可以使用prototype
的类型而不是构造函数return的类型。
type AbstractInstanceType<T> = T extends { prototype: infer U } ?
U : never
abstract class Foo{
foo:number
}
declare var foo: AbstractInstanceType<typeof Foo>;
foo.foo //ok
在使用typeof AbstractClass
的情况下,最好使用构造函数签名。 InstanceType
将适用于此:new (... a:any[]) => AbstractClass
如果您想在抽象类上创建静态工厂方法,那么将起作用:
abstract class Foo{
foo: number
static create<T extends Foo>(this: new () => T) {
return new this();
}
static createWithArgs<T extends Foo, A extends any[]>(this: new (...a: A) => T, ...a: A) {
return new this(...a);
}
}
class Bar extends Foo { }
class Baz extends Foo {
constructor(public n: string) {
super();
}
}
Bar.create()
Baz.createWithArgs("")