GraphQL与TypeScript:输入对象默认值填充时机及增改最优方案
解决方案
1. 定义基础字段基类
先创建一个不带@InputType装饰的抽象基类,统一维护所有字段的名称与默认值,避免重复定义:
abstract class BaseEntryMeaningFields { headword: string = ""; definition: string = ""; usage: string = ""; imageLink: string = ""; notes: string = ""; }
2. 实现专用输入类型
基于基类分别创建创建、更新操作的输入类型,通过@Field的nullable参数控制字段可选性:
创建用输入类型(允许部分字段提交)
将所有字段设为可选(nullable: true),保留空字符串默认值,用户可仅提交部分字段:
@InputType() export class CreateEntryMeaningInput extends BaseEntryMeaningFields { @Field(() => String, { nullable: true }) headword: string = ""; @Field(() => String, { nullable: true }) definition: string = ""; @Field(() => String, { nullable: true }) usage: string = ""; @Field(() => String, { nullable: true }) imageLink: string = ""; @Field(() => String, { nullable: true }) notes: string = ""; }
更新用输入类型(强制提交所有字段)
不设置nullable: true(默认必填),也不提供默认值,强制用户提交完整字段:
@InputType() export class UpdateEntryMeaningInput extends BaseEntryMeaningFields { @Field(() => String) headword: string; @Field(() => String) definition: string; @Field(() => String) usage: string; @Field(() => String) imageLink: string; @Field(() => String) notes: string; }
3. 在解析器中使用对应输入类型
创建操作接收CreateEntryMeaningInput,更新操作接收UpdateEntryMeaningInput,利用类默认值或手动合并完成字段填充:
// 创建操作解析器 @Mutation(() => Meaning) createMeaning( @Arg("input", () => CreateEntryMeaningInput) input: CreateEntryMeaningInput ) { // 合并输入与默认值(若需覆盖类默认值可手动处理) const meaningData = { ...new BaseEntryMeaningFields(), ...input }; return this.meaningService.create(meaningData); } // 更新操作解析器 @Mutation(() => Meaning) updateMeaning( @Arg("id") id: string, @Arg("input", () => UpdateEntryMeaningInput) input: UpdateEntryMeaningInput ) { return this.meaningService.update(id, input); }
方案优势
- 低冗余:基类集中管理字段定义,子类仅需调整字段校验规则,避免重复代码。
- 强校验:通过GraphQL输入类型的静态校验,在请求层面拦截非法输入,减少业务层判断逻辑。
- 高可读性:专用输入类型明确区分创建、更新的不同规则,代码语义清晰。
内容的提问来源于stack exchange,提问作者vls9
相关产品推荐
相关产品推荐

