【问题标题】:hasOwnProperty always returns false using TypescripthasOwnProperty 使用 Typescript 总是返回 false
【发布时间】: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


【解决方案1】:

我能够用枚举解决这个问题,只需将输入字符串与枚举值进行比较 枚举:

export enum dogFields {
  name = 'name',
  gender = 'gender'
}

【讨论】:

    猜你喜欢
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2021-11-05
    • 2018-11-05
    • 2019-05-06
    • 2017-04-29
    • 2013-04-30
    相关资源
    最近更新 更多