尝试使用 React Apollo Query 组件进行 GraphQL 查询,打字稿导致错误

Posted

技术标签:

【中文标题】尝试使用 React Apollo Query 组件进行 GraphQL 查询,打字稿导致错误【英文标题】:Trying to use React Apollo Query component for GraphQL query with typescript causing error 【发布时间】:2019-09-22 15:43:43 【问题描述】:

我正在尝试使用 Apollo 查询 GraphQl API。我正在使用 typescript 在 React 中执行此操作,但无法让 Query 组件停止抛出错误。 我对这整个组合很陌生,所以我可能会做一些明显错误的事情。有什么想法吗?

这是错误:

Type ' children: (string | (( loading, error, data : QueryResult<any, OperationVariables>) => any))[]; query: any; ' is not assignable to type 'Pick<Readonly<QueryProps<any, OperationVariables>> & Readonly< children?: ReactNode; >, "children" | "displayName" | "skip" | "onCompleted" | "onError" | "s-s-r" | "variables" | ... 6 more ... | "partialRefetch">'.
  Types of property 'children' are incompatible.
    Type '(string | (( loading, error, data : QueryResult<any, OperationVariables>) => any))[]' is not assignable to type '((result: QueryResult<any, OperationVariables>) => ReactNode) | (((result: QueryResult<any, OperationVariables>) => ReactNode) & string) | (((result: QueryResult<any, OperationVariables>) => ReactNode) & number) | ... 4 more ... | (((result: QueryResult<...>) => ReactNode) & ReactPortal)'.
      Type '(string | (( loading, error, data : QueryResult<any, OperationVariables>) => any))[]' is not assignable to type '((result: QueryResult<any, OperationVariables>) => ReactNode) & ReactNodeArray

这是我的代码:

import React from 'react';
import gql from "graphql-tag";
import  Query  from "react-apollo";


export interface LoginProps  
    data: object; item: string; query: object; loading: string; error: string;
 ;

 const getLogin =
    gql`
        
        viewer 
            login
            
        
    `;

export class Test extends React.Component<LoginProps, >  
    <Query query=getLogin>
            ( loading, error, data ) => 
                if (loading) return <p>Loading...</p>;
                if (error) return <p>Error!</p>;

                return data.viewer.map( item => 
                    <div key=item.login>
                        <p>item.login</p>
                    </div>
                );
            ;
    </Query>
;

export default Test;

【问题讨论】:

【参考方案1】:

首先,由于您没有在组件上使用状态,我建议您使用 React.FunctionComponent 而不是 React.Component

关于您的问题:您必须在组件的渲染函数中使用jsx 组件,例如:

export class Test extends React.Component<LoginProps, > 
  // HERE: use the render method
  render() 
    return (
      <Query query=getLogin>
        ( loading, error, data ) => 
          if (loading) return <p>Loading...</p>;
          if (error) return <p>Error!</p>;

          return data.viewer.map(item => 
            <div key=item.login>
              <p>item.login</p>
            </div>;
          );
        
        ;
      </Query>
    );
  

希望对你有帮助。

【讨论】:

【参考方案2】:

显然不相关,但对于那些来这里寻找答案的人来说,Query 内部的描述如下:

    <Query query=getLogin>
        (result: QueryResult) => 
          const  loading, error, data  = result;

            // ...rest here
            if (loading) return <p>Loading...</p>;
            if (error) return <p>Error!</p>;

            return data.viewer.map( item => 
                <div key=item.login>
                    <p>item.login</p>
                </div>
            );
        ;
</Query>

【讨论】:

以上是关于尝试使用 React Apollo Query 组件进行 GraphQL 查询,打字稿导致错误的主要内容,如果未能解决你的问题,请参考以下文章

React-Apollo Query 组件变量永远不会更新

在 react-apollo 的 Query 组件中设置状态

如何在 TypeScript 中为 React Apollo Query 组件编写 HOC?

从 react-apollo 模拟 <Query />

[GraphQL] Apollo React Query Component

Apollo-client (react) - 更新创建突变 - “在对象 (ROOT_QUERY) 上找不到字段 Fund()”