// 모든 믹스인에 필요
type Constructor<T = {}> = new (...args: any[]) => T;
////////////////////
// 예제 믹스인
////////////////////
// 속성을 추가하는 믹스인
function Timestamped<TBase extends Constructor>(Base: TBase) {
return class extends Base {
timestamp = Date.now();
};
}
// 속성과 메소드를 추가하는 믹스인
function Activatable<TBase extends Constructor>(Base: TBase) {
return class extends Base {
isActivated = false;
activate() {
this.isActivated = true;
}
deactivate() {
this.isActivated = false;
}
};
}
////////////////////
// 클래스를 조립하는 예제
////////////////////
// 간단한 클래스
class User {
name = '';
}
// Timestamped 적용된 User
const TimestampedUser = Timestamped(User);
// Timestamped와 Activatable이 적용된 User
const TimestampedActivatableUser = Timestamped(Activatable(User));
////////////////////
// 조립된 클래스 사용
////////////////////
const timestampedUserExample = new TimestampedUser();
console.log(timestampedUserExample.timestamp);
const timestampedActivatableUserExample = new TimestampedActivatableUser();
console.log(timestampedActivatableUserExample.timestamp);
console.log(timestampedActivatableUserExample.isActivated);