给定这两个接口(interface):
interface IFoo {
foos: string[];
fnord: string;
}
interface IFooFlat {
foo: string;
fnord: string;
}
我想转换 IFoo
的数组进入IFooFlat
通过此 map 功能:
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 中的对象中删除属性?
最佳答案
您可以将解构语法与展开语法结合起来来实现您想要的:
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"
}
]
]
关于typescript - 使用扩展语法时如何删除对象的属性以创建对象的新实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53156813/