abstract class Repository<T, K extends keyof T> {
abstract findAll(): T[];
abstract findOne(key: T[K]): T[];
abstract create(entity: Omit<T, K>): void;
abstract update(key: T[K], entity: Partial<T>): void;
abstract remove(key: T[K]): void;
}
abstract class UserRepository extends Repository<User, 'id'> {
abstract findOneByEmail(email: string): User
}