Удалить динамический ключ из объекта 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, вероятно, не машинописный текст.