gpt4 book ai didi

javascript - 如何在类型中传递泛型类型?

转载 作者:行者123 更新时间:2023-12-02 22:48:12 25 4
gpt4 key购买 nike

我正在尝试为 Typestack 类验证器创建新的约束。 “IsUnique”约束将采用实体作为类型,并将其列作为参数来检查该列是否在数据库中不存在并且是唯一的。

我已经尝试了下面的代码,但不知怎的,我无法通过registerDecorator中的验证器键将类型传递给“IsUniqueConstraint”。因为我是 Typescript 的新手,所以我不太理解它的概念。

有人可以帮我知道我们该怎么做吗?

is-unique.constraint.ts

import { registerDecorator, ValidatorConstraint, ValidatorConstraintInterface, ValidationArguments, ValidationOptions } from 'class-validator';
import { Injectable } from '@nestjs/common';
import { Repository } from 'typeorm';

@ValidatorConstraint({ name: 'isUnique', async: true })
@Injectable()
export class IsUniqueConstraint<T> implements ValidatorConstraintInterface {

constructor(private readonly repository: Repository<T>) { }

async validate(value: string, args: ValidationArguments) {
const [column] = args.constraints;

const result = await this.repository.findOne({ where: { [column]: value } });

if (result) {
return false;
}

return true;
}

defaultMessage(args: ValidationArguments) {
return `"${args.value}" already exists for ${args.constraints[0]}`;
}

}

export function IsUnique<T>(column: string, validationOptions?: ValidationOptions) {
return (object: object, propertyName: string) => {
registerDecorator({
target: object.constructor,
propertyName,
options: validationOptions,
constraints: [column],
validator: IsUniqueConstraint,
});
};
}

user.dto.ts

import { IsNotEmpty } from 'class-validator';
import { IsUnique } from './../shared/constraints/is-unique.constraint';
import { User } from './user.entity';

export class CreateUserDto {
@IsNotEmpty()
@IsUnique<User>('username')
readonly username: string;
}

最佳答案

泛型通常是仅限编译时的功能。除非您有某种方式发出元数据,包括泛型(不确定这是否容易实现)。

如果您需要在运行时使用类型,通常应该将其作为常规参数传递,因此在这种情况下,必须更改签名以适应这种情况:

@IsUnique(User, 'username')

这可能就是为什么在注入(inject)存储库时,您通过 @InjectRepository(User) 来执行此操作,它也将实体类作为参数。我怀疑 IsUniqueConstraint 是否可以按原样注入(inject)存储库。您可能需要根据装饰器传递的实体类型从 DI 容器/连接管理器解析它。

根据文档,您可以直接将对象分配给验证器,而不仅仅是类/构造函数,因此您可以创建验证器的具体实例,手动将解析的存储库传递给构造函数。

所以,也许是这样的:

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),
});
};
}

关于javascript - 如何在类型中传递泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58290629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com