【问题标题】:Typescript how to clone object except for one key打字稿如何克隆除一键外的对象
【发布时间】:2019-04-26 02:29:30
【问题描述】:

我有两个接口。除了一个键之外,它们非常相似。

interface InitialStateFromDB {
  uploads: {
    companyImage: string,
    map: string
  },
  adminPasswords: string,
  postInfos: PostInfo[] | undefined
}

interface InitialState extends Omit<InitialStateFromDB, 'adminPasswords'> {
  adminPasswords: AdminPassword
}

我从 DB 中获得了 initialState。

const initialStateFromDB: InitialStateFromDB = window.__PRELOADED_STATE__;

然后我从 initialStateFromDB 中提取每个属性的值来生成 initialState。

let adminPasswords: AdminPassword = JSON.parse(initialStateFromDB.adminPasswords);
const initialState : InitialState = {
  uploads : initialStateFromDB.uploads,
  adminPasswords,
  postInfos: initialStateFromDB.postInfos
}

但我认为除了 adminPasswords 属性之外,还有一种更简单的合并方法。所以我搜索了这个。

Clone a js object except for one key

但是,我不知道如何在 typescript 中这样做。

所以,我的问题是 “如何克隆除 Typescript 中的一个键之外的对象”

【问题讨论】:

    标签: typescript


    【解决方案1】:

    你需要的是spread operator(检查“对象传播和休息”部分)。 Typescript 是 JavaScript 的超集,它们都支持这个特性。

    const {adminPasswords, ...state} = initialStateFromDB;
    const initialState: InitialState = {
      ...state,
      adminPasswords: JSON.parse(adminPasswords)
    }
    

    【讨论】:

    • 如果你想完全省略密钥,这实际上不起作用,只有当你用其他东西覆盖它时才有效。没有铸造,我无法以优雅的方式做到这一点。 {...state, adminPasswords: undefined } 不匹配 Omit
    • 请注意,这会创建一个浅克隆,而不是深层克隆。
    【解决方案2】:

    如果您想完全省略密钥而不是覆盖它,我找到了一个可行的选项 - 使用 ts object rest(参考文档 here):

    就所提问题而言,应该是:

    const {adminPasswords, ...initialState} : InitialState = {...initialStateFromDB};

    上面的行复制了“initialStateFromDB”的副本,不包括“adminPasswords”字段。创建的新对象是“initialState”。

    【讨论】:

      猜你喜欢
      • 2015-03-24
      • 2020-03-27
      • 2016-04-14
      • 2021-02-04
      • 2013-07-17
      • 2018-02-24
      • 2020-09-28
      相关资源
      最近更新 更多