GraphQL Schema生成中input/output类型作用及校验失败问题咨询
GraphQL Scalars中[input]/[output]类型的作用及类型校验问题解析
一、[input]和[output]类型的作用
GraphQL标量类型(Scalar)支持在输入和输出场景下定义不同的类型规则,codegen生成的Scalars['XXX']['input']/Scalars['XXX']['output']就是用来明确区分这两种场景的:
[input]:对应客户端向服务端发送请求时的参数/变量类型,比如Mutation的入参、Query的筛选条件里的标量字段。[output]:对应服务端返回给客户端的数据类型,比如Query查询结果里的标量字段。
这种拆分是为了适配部分标量在输入输出时的类型差异——比如服务端返回的ID可能是字符串,但客户端传参时既可以传数字也可以传字符串,通过拆分输入输出类型,能更精准地保证类型安全。
二、类型校验失败的原因
你遇到的报错Argument of type 'number' is not assignable to parameter of type '{ input: any; output: any; }',核心问题是:
- 代码中错误地在输入场景(比如传参)引用了
output类型,或者直接使用了Scalars['Int']这类未明确分支的类型,导致TypeScript将其识别为包含input和output的对象类型,而非你预期的基础类型(比如number)。 - 当你手动移除
[input]/[output]后,TypeScript会将Scalars['XXX']解析为单一的基础类型(比如number/boolean),自然能通过校验,但这也放弃了codegen原本提供的输入输出类型区分的安全保障。
可行的解决方向
如果你的项目中输入输出的标量类型逻辑一致,可以调整codegen的配置文件(比如codegen.yml),直接指定标量对应的TS类型,避免生成嵌套的input/output结构:
scalars: Int: number Boolean: boolean ID: string | number
如果需要保留输入输出类型区分,就要检查代码中类型引用的场景,确保输入场景用[input]分支,输出场景用[output]分支。
内容的提问来源于stack exchange,提问作者Darya Balu
相关产品推荐
相关产品推荐

