首页 > 解决方案 > 如何将变量从一种类型转换为另一种类型?

问题描述

我正在获取一些包含元数据字段的数据,我想将其删除。它出现在我的类型变量中,如下所示:

type MainRecord = {
  id: string
  fieldOne: string
  related: RelatedRecord[]
  __typename: string
}

type RelatedRecord = {
  id: string
  fieldTwo: string
  __typename: string
}

我正在使用 Formik 更新记录,但我不希望在__typename为表单创建初始值时包含这些字段,因为尝试将包含元数据的数据发送到服务器会导致查询时出现语法错误。我对 Formik 表单有单独的类型,如下所示:

type MainFields = {
  id: string
  fieldOne: string
  related: RelatedFields[]
}

type RelatedFields = {
  id: string
  fieldTwo: string
}

我的解决方案是尝试将MainRecord数据转换为MainFields看起来像它的工作的对象,因为fields.__typename它不是一个有效的属性,也不是fields.related[0].__typename

const record: MainRecord = {
  id: "10",
  fieldOne: "Foo",
  __typename: "Main",
  related: [
    {
      id: "20",
      fieldTwo: "Bar",
      __typename: "Related"
    },
    {
      id: "21",
      fieldTwo: "Baz",
      __typename: "Related"
    },
  ]
}

const fields: MainFields = record // or "as MainFields"

但是,当您记录fields变量时,元数据仍然存在并且不应该存在。

console.log("fields: ", fields);

我想我可以手动以编程方式将它们剥离,但必须有更好的方法。有任何想法吗?我确定有一种打字稿方式可以完成此任务,但我只是不知道。

标签: typescript

解决方案


我不认为 TypeScript 在你使用as关键字时实际上会发生变化,它只会以“如果你这么说”的类型方式将其“视为”适当的类型。

您最好的选择是使用您自己的实用程序或类似 lodash 的工具对属性进行过滤。

使用 Lodash 删除对象属性

请参阅似乎正在考虑类似问题的这个问题。

从未在类型接口中声明的对象中删除属性


推荐阅读