Удалить динамический ключ из объекта TypeScript - PullRequest
0 голосов
/ 18 февраля 2019

В 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 ]

0 голосов
/ 18 февраля 2019

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

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

После этого b будет содержать все элементы a, кроме c.

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

Вы можете переименовать 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"]);
0 голосов
/ 18 февраля 2019

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

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

const c = 'something';

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

Здесь мы помещаем значение свойства что-то (взятое из переменной c) в переменную _ и все остальныереквизиты переходят в withoutC переменную.Тот факт, что c определен как const, позволяет машинописи правильно выводить тип withoutC.

0 голосов
/ 18 февраля 2019

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

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

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

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

...