繁体   English   中英

使用 graphql 将道具传递给高阶组件时,React-apollo Typescript 错误

[英]React-apollo Typescript errors when using graphql to pass props to higher order component

我在尝试将 React class 组件连接到我的 Apollo 缓存数据时遇到了一些问题,目前这只是本地缓存数据。

我正在关注这里的文档,但是当我访问这样的数据时,VSCode 和 Webpack 会抛出错误: this.props.data.playing ,这就是我希望访问它的方式。 尽管如此,在浏览器中这会返回正确的数据。 但是,如果我访问这样的数据: this.props.data.data.playing检查通过但在浏览器控制台中引发错误( Cannot read property 'playing' of undefined )。 所以我有理由确定这是一个类型定义错误,但我不确定我哪里出错了。

我应该指出 NPM 和所有软件包都已更新。

type AudioData = {
  bpm: number;
  beatsPerBar: number;
  playing: boolean;
  metronomeSound: string;
  playPosition: number;
  playStartTime: number;
};

type Response = {
  data: AudioData;
};

class ConnectedWorkspaceAudio extends React.Component<
  ChildProps<{}, Response>
> {
  _context: AudioContext;
  _scheduler: Scheduler;
  _recorder: Recorder;

  constructor(props: ChildProps<{}, Response>) {
    super(props);
  }

  componentDidMount(): void {
    /***/
  }

  componentDidUpdate(prevProps: ChildProps<{}, Response>): void {
    console.log(this.props.data.playing); // Fails type check, prints correctly in browser.
    if (this.props.data.data) {
      if (this.props.data.data.playing && !prevProps.data.data.playing) { // Passes type check, gives console error in browser.
        useApolloClient().writeData({ data: { playing: true } });
      }
      if (!this.props.data.data.playing && prevProps.data.data.playing) {
        useApolloClient().writeData({ data: { playing: false } });
      }
    }
  }

  /** There's some more methods including render() I don't believe are relevant. */
}


const WORKSPACE_AUDIO_QUERY = gql`
  query AudioState {
    bpm @client
    beatsPerBar @client
    playing @client
    metronomeSound @client
    playPosition @client
    playStartTime @client
  }
`;

const WorkspaceAudio = graphql<{}, Response>(WORKSPACE_AUDIO_QUERY)(
  ConnectedWorkspaceAudio
);

export { WorkspaceAudio };

这不是输入错误 - 尝试访问未准备好的数据的典型错误 - 通常在render()中,当数据尚未到达时。

console log if (this.props.data.data) { ... 和错误的日志参数之后,应该是console.log(this.props.data.data.playing); - 响应命名data (有点误导)。

这里的解决方案是不将AudioData类型包装到Response中,尽管他们在文档中使用了该模式。 我更新了以下几行:

class ConnectedWorkspaceAudio extends React.Component<
  ChildProps<{}, AudioData>
{
...

const WorkspaceAudio = graphql<{}, AudioData>(WORKSPACE_AUDIO_QUERY)(
  ConnectedWorkspaceAudio
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM