TypeScript类型与graphql类型冲突

a11xaf1n  于 2023-06-24  发布在  TypeScript
关注(0)|答案(2)|浏览(160)

我有一个GraphQL解析器和schema,看起来像这样:

import { Resolvers } from "../../generated/schema";

export const resolvers: Resolvers = {
  Query: {
    getS: async (_parent: unknown, { id }: { id: string }): Promise<GenericResponse<S>> => { ... }
    }
}

和/或

type Query {
  getS(id: ID!): getSResponse
}

type S {
  id: ID!,
  wac: Float!,
  beginDate: String!,
  endDate: String!,
}

type getSResponse implements GenericResponse {
  status: Status!
  data: S!
}

我使用GraphQL codegen检查解析器函数的类型,内容如下:

export type Resolvers<ContextType = any> = {
  Query?: QueryResolvers<ContextType>;
}

export type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {
getS?: Resolver<Maybe<ResolversTypes['getSResponse']>, ParentType, ContextType, RequireFields<QueryGetSArgs, 'id'>>;
}

export type QueryGetSArgs = {
  id: Scalars['ID']['input'];
};

export type Scalars = {
  ID: { input: string | number; output: string; }
  String: { input: string; output: string; }
  Boolean: { input: boolean; output: boolean; }
  Int: { input: number; output: number; }
  Float: { input: number; output: number; }
};

然而,我得到了这个typescript错误:

Type '(_parent: unknown, { id }: myType) => Promise<GenericResponse<S>>' is not assignable to type 'Resolver<Maybe<ResolverTypeWrapper<GetWacPercentageResponse>>, {}, any, RequireFields<QueryGetSArgs, "id">> | undefined'.
  Type '(_parent: unknown, { id }: myType) => Promise<GenericResponse<S>>' is not assignable to type 'ResolverFn<Maybe<ResolverTypeWrapper<GetSResponse>>, {}, any, RequireFields<QueryGetSArgs, "id">>'.
    Types of parameters '__1' and 'args' are incompatible.
      Type 'RequireFields<QueryGetSArgs, "id">' is not assignable to type 'myType'.
        Types of property 'id' are incompatible.
          Type 'NonNullable<string | number>' is not assignable to type 'string'.
            Type 'number' is not assignable to type 'string'.ts(2322)

我该怎么解决这个问题?

efzxgjgh

efzxgjgh1#

您的ID可以是stringnumber

ID: { input: string | number; output: string; }

但是你的解析器参数将它强类型化为string,TS正确地指出了这是一个问题,因为该解析器可以根据你的ID标量定义接收一个数字。您需要使用stringnumber来实现这一点

getS: async (_parent: unknown, { id }: { id: string | number }): Promise<GenericResponse<S>> => { ... }

但说实话,既然你已经把Resolvers类型赋给了整个resolvers对象,你应该可以完全删除内联类型,它将被推断出来:

getS: async (_parent, { id }) => { ... } // `id` should automatically be inferred as string | number
qcbq4gxm

qcbq4gxm2#

你有

type Query {
  getS(id: ID!): getSResponse
}

假设getS将接受ID = number or string类型的id。但是你的解析器实现是这样的

Query: {
    getS: async (_parent: unknown, { id }: { id: string }): Promise<GenericResponse<S>> => { ... }
}

它只接受string类型的id
很明显这里有矛盾。您可能希望将解析器参数更改为{ id: string | number }

相关问题