我有 awesome 的完全类型安全的自动生成代码graphql-codgen/vue
。我通过构建一个小包装器在我的项目中使用它,这样我的用户就不必在每次调用时都执行常见的配置任务。例如定义缓存行为、自动更新缓存、解构导致正确的类型和格式。
使用 JS 和 with 的包装器工作者,any
但我也希望它是类型安全的,并且由于graphql-codegen
已经以类型安全的方式生成所有类型和方法,我认为必须有一种方法可以做到这一点。不知何故,我认为有歧视性的工会......
所以归结为示例代码我的问题是:我有这个自动生成的代码:
//File GQLService.ts
export type CustodiansList = (
{ __typename: 'Query' }
& { custodiansList?: Maybe<Array<(
{ __typename: 'Custodian' }
& Pick<Custodian, 'id' | 'name' | 'street' | 'zip' | 'city' | 'telephone' | 'createdAt' | 'updatedAt'>
)>> }
);
type ReactiveFunctionCustodiansList = () => CustodiansListVariables
/**
* __useCustodiansList__
*
* To run a query within a Vue component, call `useCustodiansList` and pass it any options that fit your needs.
* When your component renders, `useCustodiansList` returns an object from Apollo Client that contains result, loading and error properties
* you can use to render your UI.
*
* @param baseOptions options that will be passed into the query, supported options are listed on: https://v4.apollo.vuejs.org/guide-composable/query.html#options;
*
* @example
* const { result, loading, error } = useCustodiansList(
* {
* }
* );
*/
export function useCustodiansList(variables?: CustodiansListVariables | VueCompositionApi.Ref<CustodiansListVariables> | ReactiveFunctionCustodiansList, baseOptions?: VueApolloComposable.UseQueryOptions<CustodiansList, CustodiansListVariables>) {
return VueApolloComposable.useQuery<CustodiansList, CustodiansListVariables>(CustodiansListDocument, variables, baseOptions);
}
export type CustodiansListCompositionFunctionResult = ReturnType<typeof useCustodiansList>;
现在我想用最少的 DRY 像这样“动态地”使用它:
import * as Service from "./GQLService"; // from above
// e.g. typename = "custodian"
function useQueryList(typename:string) {
const fnName = toFunctionName(typename) // e.g. useCustodiansList
const result = Service[fnName](); //! this is the problem
// we also want to return everything including a parsedResult
const listName = `${typename}sList`
return {
[listName]: parseResult(result),
...result
}
}
意图
我真的不想重新创建graphql-codgen所做的所有工作TypeTable
,因为我认为所有这些工作都已经由graphql-codegen完成。
我的目标是有人可以创建一个新的ExamplesList.graphql
,graphql-codegen
包装它,然后准备好使用useQueryList("example")
因此,虽然这是一个动态传递的参数,但它也必须能够通过某种方式映射所有服务函数的返回类型,然后得到返回的一个,Array<__typename>
或者我错了吗?而且我认为我必须以某种方式必须typename
通过解析__typenames
来自Service
const result = Service[fnName](); //! this is the problem
实际上并不是我们所做的一切,我们对其进行了更多的包装和转换,但是一旦我在这里获得了正确的类型,一切都会好起来的。