class BaseDoc {
static Collection;
static find(){
// which is expected to return an instance of SubDoc when run SubDoc.find()
return this.C
You can create a generic version of find that will have the this parameter inferred to the type of the class it's being called on, and use InstanceType to extract the actual instance type from the class type:
class BaseDoc {
static Collection: any;
static find(this: T): InstanceType {
// which is expected to return an instance of SubDoc when run SubDoc.find()
return this.Collection.find();
}
}
class SubDoc extends BaseDoc {
}
SubDoc.find() // return SubDoc
Or you can mandate that the derived class defines a generic Collection member of the appropriate type:
class Collection {
find(): T {
return null as any // dummy imeplmentation
}
}
type GetCollectionItem> = T extends Collection ? U: never;
class BaseDoc {
static Collection: Collection;
static find }>(this: T): GetCollectionItem {
// which is expected to return an instance of SubDoc when run SubDoc.find()
return this.Collection.find();
}
}
class SubDoc extends BaseDoc {
static Collection: Collection;
}
SubDoc.find() // return SubDoc