Удалить динамический ключ из объекта TypeScript

В TypeScript довольно просто клонировать объект:

const a = {...b}

или клонировать и обновить

const a = {...b, c: 'd'}

Так, например, у меня есть этот код:

const a = {
    'something': 1,
    'e': 2,
};
const c = 'something';
delete a[c];

Есть ли хороший способ удалить свойство этого объекта, вместо использования традиционногоdelete a[c] путь? (конечно же нет a[c] = undefined)

3 ответа

Решение

Вы ищете комбинацию вычисленных имен свойств и деструктуризацию. Больше информации здесь

const a = {
    'something': 1,
    'e': 2,
};

const c = 'something';

const { [c]: _, ...withoutC } = a;

Здесь мы определяем стоимость имущества (взято из c переменная) в _ переменная и все другие реквизиты идут в withoutC переменная. Дело в том, что c определяется как const позволяет машинописи выводить тип withoutC должным образом.

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

const {c, ...b} = a;

После этого b будет содержать всех членов a Кроме c,

При условии a какой-то тип, скажем, { c: string, d: string } типы c а также b будет выведено, чтобы быть string а также { d: string } соответственно. Конечно, если вам нужно явно написать эти аннотации типов, используя Omit Тип, как подсказывает @Nurbol Алпыбаев, обычно намного лучше, чем прописывать типы в длинной форме.

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

const {c: someOtherName, ...b} = a;

Вышеуказанный метод будет работать, если вы знаете имя свойства во время компиляции. Если это не так в вашем сценарии, то компилятор TypeScript не может вам так сильно помочь, потому что он не сможет определить тип результата операции.

Вам лучше печатать a как { [k: string]: number }, в таком случае delete a[c] было бы хорошо, или вы могли бы использовать что-то вроде следующего:

const exclude = <T>(map: { [k: string]: T }, omitted: string[]): { [k: string]: T } =>
  return Object.getOwnPropertyNames(a)
    .filter(k => omitted.indexOf(k) >= 0)
    .reduce((a, k) => (a[k] = map[k], a), {})
};
var b = exclude(a, ["c"]);

Конечно! Вы можете сделать это используя Omit тип:

type Omit<T, K> = Pick<T, Exclude<keyof T, K>>

type DeleteBar = Omit<{bar: 123, baz: 123}, 'bar'> // {baz: 123}

PS Я понял, что вы могли спросить о значениях, а не о типах. Вы должны спросить о JavaScript, вероятно, не машинописный текст.

Другие вопросы по тегам