打字稿/阿波罗:从内存缓存中访问属性

sto*_*elj 3 typescript react-apollo apollo-client

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

(cache, { data: { createTask } }) => {
    const allTasks = cache.readQuery({ query: ALL_TASKS }).allTasks;
}
Run Code Online (Sandbox Code Playgroud)

我收到两个编译错误:

Object is possibly 'null'.
Property 'allTasks' does not exist on type '{}'.
Run Code Online (Sandbox Code Playgroud)

我理解总体思路。readQuery可能会返回null(这是自我混淆,因为文档让我相信当没有找到结果时会抛出错误(https://www.apollographql.com/docs/react/advanced/caching.html#readquery)。

我怎样才能让编译器让我allTasks从结果中读取属性readQuery

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

Mat*_*hen 13

readQuery接受结果类型的类型参数;您可以在源代码中或通过跳转到readQueryIDE 中的声明来看到这一点。因此,您可以这样做:

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

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

  • 是的,我想您需要使用非空断言,除非/直到类型声明被修复。更新了答案。 (3认同)