Javascript ES6 Spread Operator克隆或提取另一个对象的特定密钥

Javascript ES6 Spread Operator克隆或提取另一个对象的特定密钥,javascript,ecmascript-6,typescript,Javascript,Ecmascript 6,Typescript,是否有方法克隆具有指定键的对象。例如,您有这个对象 const User = { firstName: '', lastName: '', age: '', gender: '', job: '', } 您只需克隆或提取firstName和lastName即可创建另一个对象,如: const UserPublicInfo = { firstName, lastName, } 我知道一些解决方案,但是 解决方案#1:手动 警告 小的列表没有问题,但是大的列表会很乏味

是否有方法克隆具有指定键的对象。例如,您有这个对象

const User = {
  firstName: '',
  lastName: '',
  age: '',
  gender: '',
  job: '',
}
您只需克隆或提取
firstName
lastName
即可创建另一个对象,如:

const UserPublicInfo = {
  firstName,
  lastName,
}
我知道一些解决方案,但是

解决方案#1:手动 警告 小的列表没有问题,但是大的列表会很乏味,比如说10+个键或者更多

解决方案2:Rest运算符 我们可以使用Rest操作符省略这些键

const { firstName, lastName, ...UserPublicInfo } = User
警告 这比第一个解决方案简单,但问题是如果您不知道
用户
对象的属性该怎么办?是的,您可以
console.log
记录内容,但如果在您的开发后期,某个团队成员更新了此
User
对象并决定添加另一个属性,您的应用程序可能会在开发过程中导致错误。因此,安全方面的
解决方案#1
更好

我希望它可以像下面的代码一样简单,但它会在我的transpiler上抛出错误

const UserPublicInfo = { firstName, lastName } = User
对于这个用例有更好的解决方案吗?

您可以看到克隆的实现(但ES6功能),对象.Assign()的思想,以及通过
函数.prototype.apply进行深度克隆:

export class ClonerAssign<T> implements interfaces.ICloner{
        clone<T>(sample: T): T {
            var proto = Object.getPrototypeOf(sample);
            //soft clone
            var _new = Object.assign({}, sample, proto, Object.getPrototypeOf(proto));

            //deep clone
            var _props = props(proto).filter(x => notCoreFunc(x));
            _props.forEach(key => {
                if (typeof proto[key] === 'function') {
                    (_new as any)[key] = (...args: any[]) => {
                        (proto[key] as any).apply(_new, args);
                    };
                }
            });

            return _new;
        }
    }
导出类ClonerAssign实现interfaces.ICloner{
克隆(样本:T):T{
var proto=Object.getPrototypeOf(示例);
//软克隆
var_new=Object.assign({},sample,proto,Object.getPrototypeOf(proto));
//深层克隆
var_props=props(proto).filter(x=>notCoreFunc(x));
_props.forEach(键=>{
if(原型[键]=“功能”的类型){
(_newas any)[key]=(…args:any[])=>{
(proto[key]如有)。应用(_new,args);
};
}
});
返回新的;
}
}

这个问题已经被问过很多次了。此操作通常使用的术语是“拾取”,因此您可以搜索该术语。基本答案是否定的,没有简单直接的方法。你可以检查一下。方法2看起来无效(巴贝尔一点也不喜欢它)顺便说一句,这不是“rest操作符”;正确的术语是“对象rest属性”。请参阅。从对象中显式拾取关键点的最简洁方法可能是使用数组。
export class ClonerAssign<T> implements interfaces.ICloner{
        clone<T>(sample: T): T {
            var proto = Object.getPrototypeOf(sample);
            //soft clone
            var _new = Object.assign({}, sample, proto, Object.getPrototypeOf(proto));

            //deep clone
            var _props = props(proto).filter(x => notCoreFunc(x));
            _props.forEach(key => {
                if (typeof proto[key] === 'function') {
                    (_new as any)[key] = (...args: any[]) => {
                        (proto[key] as any).apply(_new, args);
                    };
                }
            });

            return _new;
        }
    }