Closed
Description
TypeScript Version: 3.1.0-dev.20180802
Search Terms:
- Typescript Mixins Generics
- Base class expressions cannot reference class type parameters.
Code
type Constructor<T> = new (...args: any[]) => T;
interface BasicTypes {
user: {name: string}
}
class BasicHandler<E extends BasicTypes> {
// some methods here
}
interface TypesA extends BasicTypes {
user: BasicTypes["user"] & {img: string}
}
interface TypesB extends BasicTypes {
user: BasicTypes["user"] & {email?: string}
}
function UserMixin<E extends BasicTypes, B extends Constructor<BasicHandler<E>>>(Base: B) {
class UserHandler extends Base { //
constructor(...args: any[]) {
super(...args);
}
setUser(user: E["user"]) {
//...
}
}
return UserHandler;
}
// error TS2562: Base class expressions cannot reference class type parameters.
class HandlerA<MergedTypes extends TypesA> extends UserMixin<MergedTypes, Constructor<BasicHandler<MergedTypes>>>(BasicHandler) {
// some other specific methods here
}
// error TS2562: Base class expressions cannot reference class type parameters.
class HandlerB<MergedTypes extends TypesB> extends UserMixin<MergedTypes, Constructor<BasicHandler<MergedTypes>>>(BasicHandler) {
// some other specific methods here
}
type mergedTypes = TypesA & TypesB
const currentUser: mergedTypes["user"] = {
name: "Peter Parker",
img: "https://....",
email: "pp@example.org"
}
const a: HandlerA<mergedTypes> = {} as any;
a.setUser(currentUser)
const b: HandlerB<mergedTypes> = {} as any;
b.setUser(currentUser);
Expected behavior:
Mixins should allow generic types and propagate them to the inherited class
Actual behavior:
Cannot set generic type to mixin
Playground Link: Link
Related Issues: