如何解决当我不通过 GraphQL 请求项目时,如何处理 Typescript 中的非空值? - 打字稿 - GraphQL
我有一个 GraphQL (GQL) 服务器,并且在前端使用 TypeScript (TS)。这是我的 GQL 类型。
type AutomatedAlgorithmValue {
politicalEntityAlgorithmValueId: Long
politicalEntityId: Long!
...
}
politicalEntityId
不可为空。如果我要求 politicalEntityId
,这给了我行为,那么它保证在那里,但如果我不要求它,那么查询会正常运行。
我使用 graphql-codegenerator 从 GQL 架构中创建 TS 类型。 TS 类型使 politicalEntityId
为非空,所以现在在前端我必须始终请求 politicalEntityId
作为 AutomatedAlgorithmValue
类型的一部分,即使它不是我要申请。
let [results,setResults] = useState<AutomatedAlgorithmValue[]>([]);
这是我的 GQL 请求
executeAutomatedAlgorithmProcess(politicalEntityId: $id,type: $type) {
values {
politicalEntityAlgorithmValueId
}
}
此时我不需要 politicalEntityId
,但是当我尝试将数据添加到我的 results
时,TS 编译器知道我正在为 {{ 1}} 属性 null
并抛出错误。
如果存在具有其他 non-null
属性的 politicalEntityId
对象,情况会变得更糟,因为现在请求变得越来越大,每个不必要的 non-null
属性/对象。
其他人如何处理这个问题?我每次都必须创建一个新类型吗?我是否使用 non-null
来确定 non-null
Pick
中的数据是什么?是否有一个插件可以让所有内容都可以为空,如果是,我应该使用它吗?
解决方法
所以我认为您使用的类型是使用 graphql-code-generator 的 typescript
插件根据您的 GraphQL 架构生成的。正如您所说,这些类型具有架构中指定的每个字段。
我相信您还需要使用 typescript-operations plugin。打字稿操作插件基本上使用 Pick
执行您所说的操作,但会根据您定义的前端查询自动执行。因此 typescript 操作插件生成的类型与您声明的操作相匹配。
您还经常会在这两个插件之上使用第三个插件,该插件专门针对您的客户,例如 react-query、react-apollo、urql 等,因此您最终得到准备好为每个具有类型安全性的操作使用钩子。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。