Description
TypeScript Version: 4.1.2
Search Terms: class generic extends typeof 2322
I stumbled upon a type error when trying to assign a subclass of a base class with generics to typeof
of that base class.
Code
declare class Base<T extends Record<string, any>> {
a: T;
constructor(a: T);
}
class Sub1 extends Base<{a: boolean}> {}
const error: typeof Base = Sub1;
// Silence error by adding another constructor definition:
declare class BaseWith2Constructors<T extends Record<string, any>> {
a: T;
constructor(a: T);
constructor(a: T);
}
class Sub2 extends BaseWith2Constructors<{a: boolean}> {}
const noerror: typeof BaseWith2Constructors = Sub2;
Expected behavior:
I would expect the first assignment to not error as well.
Actual behavior:
I get error 2322. The error says Type 'T' is not assignable to type '{ a: boolean; }'
and Property 'a' is missing in type 'Record<string, any>' but required in type '{ a: boolean; }'
which sounds like the assignment checks are flipped.
Strangely enough, the error can be silenced by adding a second constructor definition. Is that a workaround I can rely on?
If this is expected behavior, how am I supposed to use the base class as common base in this example? I cannot do typeof Base<any>
in this case because that's a syntax error.
Playground Link:
Related Issues: