类型 'Query' 不可分配给类型 '[(options?: QueryLazyOptions<Exact< where?:

Posted

技术标签:

【中文标题】类型 \'Query\' 不可分配给类型 \'[(options?: QueryLazyOptions<Exact< where?:【英文标题】:Type 'Query' is not assignable to type '[(options?: QueryLazyOptions<Exact< where?:类型 'Query' 不可分配给类型 '[(options?: QueryLazyOptions<Exact< where?: 【发布时间】:2020-11-18 23:19:06 【问题描述】:

在 codegen 的帮助下,我生成了自定义的 graphql 钩子和类型。

    query loadUsers($where: UserFilter) 
  users(where: $where) 
    nodes 
      id
      email
      firstName
      lastName
      phoneNumber
    
    totalCount
  


export function useLoadUsersLazyQuery(baseOptions?: ApolloReactHooks.LazyQueryHookOptions<LoadUsersQuery, LoadUsersQueryVariables>) 
          return ApolloReactHooks.useLazyQuery<LoadUsersQuery, LoadUsersQueryVariables>(LoadUsersDocument, baseOptions);
        
export type LoadUsersQueryHookResult = ReturnType<typeof useLoadUsersQuery>;
export type LoadUsersLazyQueryHookResult = ReturnType<typeof useLoadUsersLazyQuery>;
export type LoadUsersQueryResult = ApolloReactCommon.QueryResult<LoadUsersQuery, LoadUsersQueryVariables>;

现在我正在尝试使用钩子并将数据传递给另一个组件,如下所示:

export const UserSearchPage: FunctionComponent = () => 
  const [criteria, setCriteria] = useState('');
  const [searchItem, setSearchItem] = useState('');
  const classes = useStyles();

  const [loadUsers,  data, error ] = useLoadUsersLazyQuery();
  let ShowUsers = () => 
    const where: UserFilter = ;
    switch (Number(criteria)) 
      case 1:
        loadUsers(
          variables: 
            where: where,
          ,
        );
        break;
      case 2:
        if (searchItem) 
          where.firstName_contains = searchItem;
          loadUsers(
            variables: 
              //where:  firstName_contains: searchItem ,
              where: where,
            ,
          );
        
        break;
      default:
        console.log('default');
    
  ;

  return (
    <div> 
    <div className=classes.container>
        <Select
          value=criteria
          onChange=event => setCriteria(event.target.value as string)
          displayEmpty>
          <MenuItem disabled value="">
            <em>Search By</em>
          </MenuItem>
          <MenuItem value=1>All</MenuItem>
        </Select>
        <Button className=classes.button onClick=() => ShowUsers()>
          ' '
          <SearchIcon />
          Search
        </Button>
        <br></br>
        data!==null  && data!==undefined && <UsersFoundList data=data />
      </div>
      )
    </div>
  );
;
type UsersFoundListProps = 
    data: LoadUsersQueryResult,
;
export const UsersFoundList: FunctionComponent<UsersFoundListProps> = (
    data,
) => 
    console.log('data UserList', data);
    return (
        null
    );
;

对于数据,我使用的是 codegen 创建的自定义类型。但是,我不断收到以下数据错误:

<UsersFoundList data=data />
Type 'LoadUsersQuery' is missing the following properties from type 'QueryResult<LoadUsersQuery, Exact< where?: UserFilter | null | undefined; >>': client, data, loading, networkStatus, and 8 more.

由于类型是自动生成的,这应该像在其他情况下一样工作。

export const LoadUsersDocument = gql`
  query loadUsers($where: UserFilter) 
    users(where: $where) 
      nodes 
        id
        email
        firstName
        lastName
        phoneNumber
      
      totalCount
    
  
`;

【问题讨论】:

您传递的data 类型是您的“基本/根数据类型”,没有任何修饰符,只是在生成器的开头(作为基本类型)某处定义的纯预期字段类型(@987654328 @ ?) 不确定我是否正确理解了您的 qs,但 LoadUsersDocument 是带有 gql 标签的查询本身。 LoadUsersQueryResult 在整个 graphql 索引文件中只定义一次(就像我在 qs 中显示的那样)。 @xadm loadUsersDocument 的定义?它返回的数据类型/形状? 添加到 qs@xadm 我们只需要 useQuery 返回的“数据”字段类型 - 节点:用户类型数组、totalCount 类型等...useLoadUsersQuery defs? 【参考方案1】:

您的数据形状应该像 docs 一样键入

const [loadUsers, data, error ] = useLoadUsersLazyQuery();

如果生成器没有定义data 类型,那么您需要传递整个结果:

const queryResult = useLoadUsersLazyQuery();
const [loadUsers,  data, error ] = queryResult;

然后将其作为道具传递

data!==null  && data!==undefined && <UsersFoundList data=queryResult />

data 输入 &lt;UsersFoundList/&gt; 保持不变:

type UsersFoundListProps = 
  data: LoadUsersQueryResult,
;

但是你需要使用data.'prefix'或者分解它:

const nodes, totalCount = props.data.data; // instead of usual 'props.data'

nodes 将是一个数组,totalCount 是一个数字

【讨论】:

doc中的数据类型是UserConnection,也是codegen定义的。我也尝试过使用它,但这也不起作用。在我之前的项目中,像 LoadUsersQueryResult 这样的东西就可以了。所以我猜我使用 codegen 的方式有问题:( type UsersFoundListProps = data: UserConnection 出错?

以上是关于类型 'Query' 不可分配给类型 '[(options?: QueryLazyOptions<Exact< where?:的主要内容,如果未能解决你的问题,请参考以下文章

类型 '() => void' 不可分配给类型 '() => '

反应类型错误“不可分配给'从不'类型的参数”

类型 '' 不可分配给类型 '() =>

类型“”不可分配给类型“JwtConfig”

类型“XX”不可分配给类型“YY”。 'XX' 可分配给'YY' 类型的约束,但'YY' 可以被实例化

打字稿 - 字符串'不可分配给类型'FC