打字稿如何克隆除一键之外的对象

Bye*_*oon 6 typescript

我有两个接口。除了一把钥匙之外,它们真的很相似。

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

interface InitialState extends Omit<InitialStateFromDB, 'adminPasswords'> {
  adminPasswords: AdminPassword
}
Run Code Online (Sandbox Code Playgroud)

我从 DB 获得了 initialState。

const initialStateFromDB: InitialStateFromDB = window.__PRELOADED_STATE__;
Run Code Online (Sandbox Code Playgroud)

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

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

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

克隆一个 js 对象,除了一键

但是,我不知道如何在打字稿中做到这一点。

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

Xie*_*lei 5

您需要的是扩展运算符(检查“对象扩展和休息”部分)。Typescript 是 JavaScript 的超集,两者都支持此功能。

const {adminPasswords, ...state} = initialStateFromDB;
const initialState: InitialState = {
  ...state,
  adminPasswords: JSON.parse(adminPasswords)
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您想完全省略该密钥,这实际上不起作用,只有当您用其他东西覆盖它时才有效。如果不进行强制转换,我无法以优雅的方式做到这一点。{...state, adminPasswords: undefined } 不匹配 Omit&lt;InitialStateFromDB, 'adminPasswords'&gt; (2认同)
  • 请注意,这会创建浅克隆,而不是深克隆。 (2认同)