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

标签 typescript properties spread-syntax

给定这两个接口(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/

相关文章:

javascript - 是否可以创建一个对象,其键与另一个对象匹配,值与函数输入参数匹配?

reactjs - React 组件 props 中的展开运算符

properties - NSStringto 类成员分配崩溃

python - 无法理解 @property 如何知道哪个变量是属性?

typescript - src 属性中的 VueJS 插值

angular - @types/lodash/common/array.d.ts(483,22) : error TS1005: ';'

asp.net-mvc - ASP.Net MVC 强类型部分 View 和继承属性

javascript - 分配和解包到一个数组到另一个数组之间的区别

typescript - 在 Typescript 项目中添加本地依赖在 JS 中不起作用

Angular - 具有嵌套 FormGroup 的组件中没有用于表单控制的值访问器