// https://www.typescriptlang.org/docs/handbook/mixins.html
type Constructor<T = {}> = new (...args: any[]) => T;
type AbstractConstructor<T> = Function & { prototype: T };
// type ConstructorFunction = abstract new (...args: any[]) => any;
declare type ConstructorFunction<T extends Utilities> = new (...args: any[]) => T;
type Constructor2<T> = new (...args: any[]) => T
export default function Activatable<TBase extends Constructor2>(Base: TBase) {
return class extends Base {
// Mixins may not declare private/protected properties
// however, you can use ES2020 private fields
_scale = 111111111111111111111111;
_isActivated = false;
_timestamp = Date.now();
activate() {
this._isActivated = true;
}
deactivate() {
this._isActivated = false;
}
setScale(scale: number) {
this._scale = scale;
}
get scale(): number {
return this._scale;
}
};
}
import Activatable from '@/store/module/abstract/mixin/countdown.ts'
abstract class AbstractModuleForm {...}
abstract class AbstractModuleCountdownForm extends Activatable(AbstractModuleForm) {...}
class Test extends AbstractModuleCountdownForm {...}
Все примеры конструктора миксина выше ломают код, выдает сотни ошибок всех используемых методов, параметров классов включая того который расширяется.
В итоге в классах есть методы миксина, но все остальное слетает.
Проблема в том, что 2+ абстрактных класса из разных модулей обладают одинаковым набором полей и методов, к примеру createdAt, updatedAt.
Пытаюсь сделать миксин, по документации и ответам на СО все слетает.
Примеры ошибок
- Generic type 'Constructor2' requires 1 type argument(s).
- Type 'TBase' is not a constructor function type.
- Cannot create an instance of an abstract class.
- Argument of type 'typeof A' is not assignable to parameter of type 'Constructor<{}>'.
- Cannot assign an abstract constructor type to a non-abstract constructor type.
- Cannot create an instance of an abstract class.
- A mixin class that extends from a type variable containing an abstract construct signature must also be declared 'abstract'.
- Cannot create an instance of an abstract class.
// это все другие классы что наследуют класс с миксином, все из проперти и методы вырезаются
TS2339: Property 'setFieldValueByFieldName' does not exist on type 'SecuredModuleFormUpdateAccount'.
Существует ли рабочий способ для абстрактных классво / методов миксина в TS?
Если да, то рабочий пример можно?
TS Playground
Важно подметить, исопльзуется библиотека для
vuex class moduels