【问题标题】:Typescript/Apollo: access property from in memory cacheTypescript/Apollo:从内存缓存中访问属性
【发布时间】:2019-02-20 05:15:08
【问题描述】:

我正在使用 Apollo Client 并且正在学习 Typescript。我有一个带有此更新道具的Mutation 组件:

(cache, { data: { createTask } }) => {
    const allTasks = cache.readQuery({ query: ALL_TASKS }).allTasks;
}

我得到两个编译错误:

Object is possibly 'null'.
Property 'allTasks' does not exist on type '{}'.

我理解大意。 readQuery 可能会返回 null(这很容易混淆,因为文档让我相信当没有找到结果时会引发错误 (https://www.apollographql.com/docs/react/advanced/caching.html#readquery)。

如何让编译器让我从readQuery 的结果中读取属性allTasks

另外,仅供参考,我尝试运行 console.log(cache.readQuery({ query: ALL_TASKS })) 并确认那里确实存在有效数据,并带有一个名为的属性。

【问题讨论】:

    标签: typescript react-apollo apollo-client


    【解决方案1】:

    readQuery 接受结果类型的类型参数;你可以看到这个in the source code 或者在你的IDE 中跳转到readQuery 的声明。因此,您可以这样做:

    interface AllTasksResult {
      allTasks: any;  // TODO: Put correct type here
    }
    // ...
    const allTasks = cache.readQuery<AllTasksResult>({ query: ALL_TASKS })!.allTasks;
    

    关于null:考虑为类型声明和文档之间的不一致提交一个错误。目前,感叹号表示您知道前面的表达式(readQuery 的返回值)不会为 null 或未定义。

    【讨论】:

    • 感谢您的回答。我将其复制/粘贴到我的代码中,但仍然收到Object is possibly 'null'.
    • 是的,我想你需要使用非空断言,除非/直到类型声明被修复。更新了答案。
    猜你喜欢
    • 2017-12-08
    • 2019-02-20
    • 2021-02-09
    • 2020-07-09
    • 1970-01-01
    • 2016-11-27
    • 2017-07-01
    • 2021-10-20
    • 1970-01-01
    相关资源
    最近更新 更多