* Add support for abstract constructor types * Add backwards-compatible overloads for creating/updating constructor types * Reverting use of 'abstract' in lib/es5.d.ts due to eslint issues * Update baseline due to reverting lib * Add error for failing to mark an mixin class as abstract * Fix declaration/quick info for abstract construct signatures
37 lines
877 B
TypeScript
37 lines
877 B
TypeScript
// @target: esnext
|
|
// @declaration: true
|
|
|
|
interface Mixin {
|
|
mixinMethod(): void;
|
|
}
|
|
|
|
function Mixin<TBaseClass extends abstract new (...args: any) => any>(baseClass: TBaseClass): TBaseClass & (abstract new (...args: any) => Mixin) {
|
|
abstract class MixinClass extends baseClass implements Mixin {
|
|
mixinMethod() {
|
|
}
|
|
}
|
|
return MixinClass;
|
|
}
|
|
|
|
class ConcreteBase {
|
|
baseMethod() {}
|
|
}
|
|
|
|
abstract class AbstractBase {
|
|
abstract abstractBaseMethod(): void;
|
|
}
|
|
|
|
class DerivedFromConcrete extends Mixin(ConcreteBase) {
|
|
}
|
|
|
|
const wasConcrete = new DerivedFromConcrete();
|
|
wasConcrete.baseMethod();
|
|
wasConcrete.mixinMethod();
|
|
|
|
class DerivedFromAbstract extends Mixin(AbstractBase) {
|
|
abstractBaseMethod() {}
|
|
}
|
|
|
|
const wasAbstract = new DerivedFromAbstract();
|
|
wasAbstract.abstractBaseMethod();
|
|
wasAbstract.mixinMethod(); |