Вместо удаления свойства из 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"]);