Typescript: Omit a property from all interfaces in a union, but keep the union structure Typescript: Omit a property from all interfaces in a union, but keep the union structure typescript typescript

Typescript: Omit a property from all interfaces in a union, but keep the union structure


You want to distribute the Omit across a union. Luckily, you can use distributive conditional types to achieve this:

type DistributiveOmit<T, K extends keyof any> = T extends any  ? Omit<T, K>  : never;

The T extends any construction looks like it doesn't do much, but since T is a type parameter, it distributes the conditional type across any union constituents of T.

Let's test it:

type CC = DistributiveOmit<C, "toRemove">;// type CC = Pick<A, "key1" | "key2"> | Pick<B, "key1" | "key3">

You can verify that this is equivalent to the CC type you want.

Hope that helps; good luck!

Link to code


Another approach is:

export declare type Without<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
type CC = Without<A, "toRemove">| Without<B, "toRemove">;