使用扩展语法以创建对象的新实例时如何删除对象的属性?
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"
]
]
【讨论】:
以上是关于使用扩展语法以创建对象的新实例时如何删除对象的属性?的主要内容,如果未能解决你的问题,请参考以下文章