在Typescript / GraphQL中连接或推断字符串

时间:2019-11-19 20:35:54

标签: typescript graphql apollo apollo-client

问题

尝试推断 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?

0 个答案:

没有答案