GraphQL Codegen如何仅将Resolver返回类型设为Partial并保留参数必选
解决方案
你需要使用 @graphql-codegen/typescript-resolvers 提供的 defaultReturnTypeMapper 配置项,该配置专门用于修改Resolver的返回类型,完全不会影响父参数parent的类型约束。
具体配置修改
将你之前添加的defaultMapper配置删除,替换为defaultReturnTypeMapper即可,完整配置如下:
overwrite: true schema: "src/**/*.(resolver|type).ts" documents: null generates: src/graphql/generated/graphql.ts: plugins: - "typescript" - "typescript-resolvers" config: typesSuffix: GQL resolverTypeSuffix: Resolver # 仅修改Resolver返回类型为Partial,不影响入参类型 defaultReturnTypeMapper: Partial<{T}>
配置效果
- 所有Resolver的返回值会自动被包裹为
Partial<对应GQL类型>,你不需要再写as any之类的强制类型转换,直接返回缺少待委托解析字段的对象即可正常通过类型校验 - Resolver的入参
parent依旧保持完整的必选类型约束,不需要额外添加类型断言
注意事项
如果你的@graphql-codegen/typescript-resolvers版本低于v2.7.0,需要先升级到最新稳定版才能支持该配置项。如果暂时无法升级,可以手动定义通用返回类型包裹每个Resolver的返回值,示例如下:
type ResolverRet<T> = Partial<T> | Promise<Partial<T>> // 使用时 export const CountryResolver: CountryResolverGQL<GQLContext> = { async regions(parent, _args, { dataSources }): ResolverRet<RegionGQL[]> { const regions = await dataSources.placesService.getRegionsFromCountryId(parent.id!) return regions.map((region) => ({ ...region, country: parent })) } }
内容的提问来源于stack exchange,提问作者Some random IT boy
相关产品推荐
相关产品推荐

