使用扩展语法以创建对象的新实例时如何删除对象的属性?

Posted

技术标签:

【中文标题】使用扩展语法以创建对象的新实例时如何删除对象的属性?【英文标题】:How to remove an object's property when using the spread syntax in order to create a new instance of an object? 【发布时间】:2019-04-08 22:55:54 【问题描述】:

鉴于这两个接口:

interface IFoo 
    foos: string[];
    fnord: string;


interface IFooFlat 
    foo: string;
    fnord: string;

我想通过这个映射函数将IFoo 的数组转换为IFooFlat

const foos: IFoo[] = [
    
        foos: [
            "narf",
            "poit"
        ],
        fnord: "fnord"
    
];

const flattened: IFooFlat[][] = foos.map((fooObject: IFoo): IFooFlat[] => 
    fooObject.foos.map((fooItem: string): IFooFlat => 
        return 
            ...fooObject,
            foo: fooItem,
        ;

    );
);

但这会产生错误:

Type ' foo: string; foos: string[]; fnord: string; ' is not assignable to type 'IFooFlat'.
  Object literal may only specify known properties, and 'foos' does not exist in type 'IFooFlat'.

我现在想删除 foos 属性,但我不想显式应用每个属性(我的真实案例示例有更多属性),我只想删除一个非常具体的属性,即 foo。

因此,我尝试创建一个克隆并删除该属性,但它在抛出相同的错误时失败了:

const flattened = foos.map((foosObject: IFoo): IFooFlat[] => 
    const clone = Object.assign(foosObject, );
    delete clone.foos;

    return foosObject.foos.map((oneFooString: string): IFooFlat => 
        return 
            ...clone,
            foo: oneFooString,
        ;
    );
);

如何在 TypeScript 中删除对象的属性?

【问题讨论】:

spread syntax 不是运算符。 【参考方案1】:

你可以结合解构语法和展开语法来达到你想要的效果:

const flattened = foos.map((foosObject: IFoo): IFooFlat[] => 
    const  foos, ...clone  = foosObject; // clone will contain all properties but `foos`.

    return foos.map((oneFooString: string): IFooFlat => 
        return 
            ...clone,
            foo: oneFooString,
        ;
    );
);

console.log(JSON.stringify(flattened, null, 4));

将打印:

[
    [
        
            "fnord": "fnord",
            "foo": "narf"
        ,
        
            "fnord": "fnord",
            "foo": "poit"
        
    ]
]

【讨论】:

以上是关于使用扩展语法以创建对象的新实例时如何删除对象的属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建集合扩展以在具有属性的集合中查找唯一对象?

vue 添加对象的新属性的方法

create

如何创建对象的新实例并将其传递到数组 SwiftUI

如何覆盖父对象的静态属性并让父对象访问 PHP 中的新值?

如何将 JavaScript 类实例与对象合并?