【问题标题】:How to cast a variable from one type to another?如何将变量从一种类型转换为另一种类型?
【发布时间】:2020-08-29 23:48:36
【问题描述】:

我正在获取一些包含元数据字段的数据,我想将其删除。我想到了这样的类型变量:

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


【解决方案1】:

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

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

Removing object properties with Lodash

看到这个似乎正在考虑类似问题的问题。

Remove properties from an object that are not declared in a type interface

【讨论】:

  • 我听说过 lodash。我会调查的。如果您有使用 lodash 解决此问题的快速解决方案,请将其添加到您的答案中,我会将其标记为已接受的答案。
【解决方案2】:

使用 lodash 的 omit 函数,我找到了一种方法来执行递归 omit,如下所示:

function omitDeep(obj: any, keyToOmit: string) {
  _.forIn(obj, function (value, key) {
    if (_.isObject(value)) {
      omitDeep(value, keyToOmit);
    } else if (key === keyToOmit) {
          delete obj[key];
    }
  });
}
```js

【讨论】:

  • 请记住,您现在可以使用扩展运算符轻松完成此操作,如 const { [keyToOmit]: _, ...rest } = obj,其中 obj 是原始值,keyToOmit 是要“删除”的属性,_ 是变量名,它是用作丢弃物,而 ...rest 是可以在之后使用的剩余属性。 (虽然这只是一层深)
  • 是的,我需要一个更实质性的递归解决方案。我实际上尝试了这样的解决方案,它的参与程度将超出我的预期。不过,Spread 运算符对于一些简单的事情来说是一个很好的解决方案,我同意。
猜你喜欢
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
相关资源
最近更新 更多