0

It appears that class types in flow always refer to instances of that class and one uses typeof to refer to the actual class itself. So, if I want a variable to refer to a subclass (not an instance) of a base class, I can do:

class MyBaseClass {}
class MySubClass extends MyBaseClass {}
let a: $Subtype<MyBaseClass> = MySubClass; // fails
let b: $Subtype<MyBaseClass> = new MySubClass(); // works, but I don't want this.
let c: $Subtype<typeof MyBaseClass> = MySubClass; // works! Ok, we're good

However, I can't seem to do this with type parameters! For example, the following:

type GenericSubclass<T> = $Subtype<typeof T>;
// fails with `^ identifier `T`. Could not resolve name`

If I try the following Typescript trick (see Generic and typeof T in the parameters), it also fails:

type ValidSubclass<T> = { new(): T };
const c: ValidSubclass<BaseClass> = MySubClass;
// fails with: property `new`. Property not found in statics of MySubClass

Note that I tried new, __proto__ and constructor.

What gives? Is there a workaround?

Robert Balicki
  • 1,583
  • 2
  • 16
  • 24

1 Answers1

2
typeof MyBaseClass

is

Class<MyBaseClass>

so you can do

type GenericSubclass<T> = $Subtype<Class<T>>;
loganfsmyth
  • 156,129
  • 30
  • 331
  • 251