Как удалить свойство объекта при использовании синтаксиса распространения для создания нового экземпляра объекта? - PullRequest
0 голосов
/ 05 ноября 2018

Учитывая эти два интерфейса:

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?

1 Ответ

0 голосов
/ 05 ноября 2018

Вы можете комбинировать синтаксис деструктуризации с синтаксисом распространения, чтобы достичь желаемого:

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"
        }
    ]
]
...