我正在使用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 }))
并确认那里确实存在调用的属性的有效数据。
readQuery
接受结果类型的类型参数;您可以在源代码中看到这一点,也可以通过跳转到 IDE 中的readQuery
声明来查看这一点。 因此,您可以执行以下操作:
interface AllTasksResult {
allTasks: any; // TODO: Put correct type here
}
// ...
const allTasks = cache.readQuery<AllTasksResult>({ query: ALL_TASKS })!.allTasks;
关于null
:考虑为类型声明和文档之间的不一致提交错误。 现在,感叹号声明您知道前面的表达式(readQuery
的返回值(不会为 null 或未定义。