You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带联合类型的输入类型设计模式选型问询

可行解决思路

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 04:35:26