代码之家  ›  专栏  ›  技术社区  ›  aarona

如何将变量从一种类型转换为另一种类型?

  •  0
  • aarona  · 技术社区  · 5 年前

    我得到了一些数据,其中有一个元数据字段,我想把它去掉。它出现在我的类型化变量中,如下所示:

    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 数据作为a 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);
    

    我想我可以用手工编程的方式把它们去掉,但肯定有更好的方法。有什么想法吗?我确信有一种打字方式可以实现这一点,但我只是不知道。

    1 回复  |  直到 5 年前
        1
  •  1
  •   zero298    5 年前

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

    你最好的选择是用你自己的实用程序或类似lodash的东西对房产进行过滤。

    Removing object properties with Lodash

    看看这个问题,它似乎在考虑类似的事情。

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

        2
  •  0
  •   aarona    5 年前

    使用lodash 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
    
    推荐文章