我有两个界面。除了一键外,它们真的很相似。
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中的一个键以外的对象”
答案 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”。