GraphQL和TypeScript的输入对象:我应该在什么时候填充默认值?

np8igboo  于 2023-03-04  发布在  TypeScript
关注(0)|答案(1)|浏览(108)

所以这更多的是一个设计问题。
我有一个名为Meaning的对象(基本上是一个字典记录),还有一个名为EntryMeaningInput的输入对象(我这样称呼它是因为Entry [基本上是中心词]是一个不同的实体,但它并不重要)。
问题在于:对于creatinga Meaning,我希望用户只能输入某些字段,而不能输入其他字段(部分对象),然后在某个时候填充它们(使用空字符串);但对于更新,我不想要
updateMeaning中(在解析器中),我可以尝试写入:

@Arg("options", () => EntryMeaningInput) options: Partial<EntryMeaningInput>

但是GraphQL不理解Partial<T>
现在,我的输入对象看起来像这样(看起来像GraphQL从TS中拾取它们):

@InputType()
export class EntryMeaningInput {
  @Field(() => String)
  headword: string = "";

  @Field(() => String)
  definition: string = "";

  @Field(() => String)
  usage: string = "";

  @Field(() => String)
  imageLink: string = "";

  @Field(() => String)
  notes: string = "";
}

一种解决方案是创建两个输入类型,一个用于创建,一个用于更新,但这似乎有点多余。
我还知道Nest.js(我没有在这个应用程序中使用)有the PartialType util

@InputType()
export class UpdateUserInput extends PartialType(CreateUserInput) {}

什么是最好的(最优雅的?)方式去做这件事?

pobjuy32

pobjuy321#

一种流行的方法是将某些属性标记为可空:

@InputType()
export class EntryMeaningInput {
  @Field(() => String, {
    nullable: true,
  })
  headword?: string = "";

  @Field(() => String, {
    nullable: true,
  })
  definition?: string = "";

  @Field(() => String)
  usage: string = "";

  // snip
}

它消除了为创建和更新突变创建单独类型的需要。
缺点是API不够明确,这可能导致API用户在需要时不包含缺失值。这可以通过解析器或服务中输入对象的JavaScript验证来缓解。

相关问题