Generics - это, как правило, функция только во время компиляции. Если у вас нет какого-либо способа передачи метаданных, включая обобщенные (не уверен, что это легко возможно).
Если вам нужно использовать тип во время выполнения, вы обычно должны передавать его как обычный аргумент, поэтому в этом случае подпись должна измениться, чтобы приспособиться к этому:
@IsUnique(User, 'username')
Возможно, поэтому, когда вы вводите репозитории, вы делаете это через @InjectRepository(User)
, который также принимает класс сущности в качестве аргумента. Я сомневаюсь, что в IsUniqueConstraint
хранилище может быть введено как есть. Вам, вероятно, потребуется разрешить его из контейнера / диспетчера соединений DI на основе типа сущности, передаваемого декоратором.
В соответствии с документацией вы можете напрямую назначить объект validator
, а не просто класс /конструктор, так что вы можете создать конкретный экземпляр вашего валидатора, вручную передавая разрешенный репозиторий в конструктор.
Итак, может быть что-то в этом роде:
import { getRepository } from "typeorm";
// ...
export function IsUnique(
entity: Function,
column: string,
validationOptions?: ValidationOptions) {
// Not sure if this works here. Maybe it needs to be
// moved into the returned function or a different resolution
// mechanism is required.
const repository = getRepository(entity);
return (object: object, propertyName: string) => {
registerDecorator({
target: object.constructor,
propertyName,
options: validationOptions,
constraints: [column],
validator: new IsUniqueConstraint(repository),
});
};
}