Delete a dynamic key from a TypeScript object Delete a dynamic key from a TypeScript object typescript typescript

Delete a dynamic key from a TypeScript object


You're looking for combination of computed property names and destructuring. More info here

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

Here we're putting value of property something (taken from c variable) into _ variable and all the other props go to withoutC variable. The fact that c defined as const allows typescript to infer the type of withoutC properly.


Rather than deleting the property from a, use destructured assignment to create a new object without that property:

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

After this b will contain all members of a except c.

Given that a is some type, say, { c: string, d: string } the types of c and b will be inferred to be string and { d: string } respectively. Of course, if you have to explicitly write these type annotations, using an Omit type as @Nurbol Alpybayev suggests is usually a lot better than having to spell out the types in long form.

You can rename c to avoid conflicts with another name using this syntax:

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

The above method will work if you know the property name at compile time. If that's not the case in your scenario, then the TypeScript compiler can't really help you that much because it won't be able to determine the result type of the operation.

You'd be better off typing a as { [k: string]: number }, in which case delete a[c] would be fine, or you could use something like the following:

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"]);


Sure! You can do this using Omit type:

type Omit<T, K> = Pick<T, Exclude<keyof T, K>>type DeleteBar = Omit<{bar: 123, baz: 123}, 'bar'> // {baz: 123}

P.S. I realized that you might have asked about values, not types. You should have ask about javascript probably, not typescript.