我有一个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)
我该怎么解决这个问题?
2条答案
按热度按时间efzxgjgh1#
您的ID可以是
string
或number
:但是你的解析器参数将它强类型化为
string
,TS正确地指出了这是一个问题,因为该解析器可以根据你的ID
标量定义接收一个数字。您需要使用string
或number
来实现这一点但说实话,既然你已经把
Resolvers
类型赋给了整个resolvers
对象,你应该可以完全删除内联类型,它将被推断出来:qcbq4gxm2#
你有
假设
getS
将接受ID = number or string
类型的id
。但是你的解析器实现是这样的它只接受
string
类型的id
。很明显这里有矛盾。您可能希望将解析器参数更改为
{ id: string | number }
。