【发布时间】:2020-06-25 17:07:12
【问题描述】:
我在 TypeGraphQL 中实现了一个过滤器,我首先检查该类是否具有用户请求过滤的属性。我正在尝试使用 hasOwnProperty,但即使属性正确,它也总是返回 false。
在解析器中查询:
@Query(() => [Dog] )
async dogs(
@Arg('filter') filter: FilterInput
): Promise<Dog []> {
console.log(filter.field)
console.log(Dog.prototype.hasOwnProperty(filter.field))
const dogs = await Dog.find({where: {[filter.field]: `${filter.value}`}})
return dogs
}
狗实体:
@ObjectType()
@Entity()
export class Dog extends BaseEntity {
@Field(() => ID)
@PrimaryGeneratedColumn()
id: number
@Field()
@Column()
name: string
@Field()
info(@Root() parent: Dog): string {
return `gender: ${parent.gender} ; name: ${parent.name}`
}
@Field()
@Column()
gender: string
}
过滤器输入类型:
import { InputType, Field } from "type-graphql";
@InputType()
export class FilterInput {
@Field()
field: string
@Field()
value: string
}
【问题讨论】:
-
您是否尝试使用
filter.field in Dog.prototype语法? -
我试过做'Dog.prototype[filter.field]'但它抛出一个错误:元素隐含地具有'any'类型,因为'string'类型的表达式不能用于索引输入“狗”。
-
是的,那是因为您使用的 TS 将
strict配置设置为true。但这是一个很好的做法。尝试做这样的事情:if(filter.field in Dog.prototypre) {...}在这个 if 范围内,TS 会知道filter.field的类型是keyof typeof Dog.prototype -
我刚试过
if(filter.field in Dog.prototype) { console.log(true) } else { console.log(false) },不管该字段是否有效,它仍然总是返回false -
filter.field的值到底是什么?必须是字符串
标签: javascript resolver typegraphql