尝试推断 TypeScript 中几个 graphQL 查询的返回类型。主要问题是查询返回包装在查询名称中的对象。因此,可以将对用户的查询命名为listUsers
,然后返回User[]
;但是,在GraphQL / Apollo中,它返回Record<'listUsers', User[]>
。我想知道如何使用TypeScript推断'list${queryName}'
键。
const getUsers = () => apolloClient.query<Record<'listUsers', User[]>>({
query: gql`
query {
listUsers {
...UserFragment
}
}
${USER_FRAGMENT}
`
})
我想创建一个函数以返回以下各个方法:列表,详细信息,创建,更新,删除。我想知道是否可以传递GraphQL类型的string
和返回类型的类型。像这样:
const createResource = <T, K extends string>(name: K, fragment: string) => ({
list() {
// I want to concatenate 'list' and `name`, but I don't think I can!
return apolloClient.query<Record<`list${name}s`, T[]>>({
query: gql`
query {
list${name}s {
...${name}Fragment
}
}
${fragment}
`
})
},
// more methods here for `create`, `update`, `delete`, using the same name and fragment...
})
有没有办法创建这样的类型?
Record<`list${name}`, T[]>
如果没有(我认为没有),那么解决此问题的更好方法是什么?我真的不想为每个模型都复制粘贴所有这些方法。我也不想将它们全部减少为:
Record<string, T[]>
然后必须猜测关键是什么:
const userReq = await getUsers()
userReq.data.listUsers // ??? is this right?