带联合类型的输入类型设计模式选型问询
可行解决思路
1. 使用GraphQL输入联合类型
现在多数成熟的GraphQL服务端实现(如Apollo Server、TypeGraphQL)都支持输入联合类型,可以直接对应TypeScript的联合类型:
input LineAInput { type: PossibleLineTypesEnum! = A exclusiveToA: String! } input LineBInput { type: PossibleLineTypesEnum! = B exclusiveToB: Int! } union LineInput = LineAInput | LineBInput input WordDocumentInput { name: String! lines: [LineInput!]! }
客户端提交mutation时,必须严格按照对应类型提交专属属性,服务端可以直接根据类型分支处理,不需要手动校验可空属性,同时能和TypeScript的联合类型一一对应,大幅减少手动转换的工作量。
2. 带位置标记的统一行输入类型
如果不想用输入联合类型,可以给每行添加position字段维护顺序,同时用一个统一的输入类型包裹不同的行类型:
input LineAInput { exclusiveToA: String! } input LineBInput { exclusiveToB: Int! } input TypedLineInput { type: PossibleLineTypesEnum! position: Int! lineA: LineAInput lineB: LineBInput } input WordDocumentInput { name: String! lines: [TypedLineInput!]! }
提交时客户端给每一行指定position和对应类型的属性,服务端可以根据position排序,同时根据type校验对应属性是否存在,这种方式比方案1的手动校验更清晰,也解决了方案2的顺序丢失问题。
3. 借助代码生成工具同步类型
如果类型复杂度很高,可以使用GraphQL代码生成工具(如@graphql-codegen/cli),根据GraphQL输入类型自动生成对应的TypeScript类型,或者反过来从TypeScript类型生成GraphQL定义,自动保持两者的一致性,避免手动转换的麻烦。
内容的提问来源于stack exchange,提问作者STH12
相关产品推荐
相关产品推荐

