微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当我不通过 GraphQL 请求项目时,如何处理 Typescript 中的非空值? - 打字稿 - GraphQL

如何解决当我不通过 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-queryreact-apollourql 等,因此您最终得到准备好为每个具有类型安全性的操作使用钩子。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。