Typescript如何克隆一个键以外的对象

时间:2019-04-26 02:29:31

标签: typescript

我有两个界面。除了一键外,它们真的很相似。

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

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

然后我从数据库中获得了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中的一个键以外的对象”

2 个答案:

答案 0 :(得分:1)

您需要的是spread operator(检查“对象展开和静止”部分)。 Typescript是JavaScript的超集,两者均支持此功能。

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

答案 1 :(得分:0)

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

如果问的问题是:

<块引用>

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

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