Typescript 2.8: Remove properties in one type from another

1.3k Views Asked by At

In the changelog of 2.8, they have this example for conditional types:

type Diff<T, U> = T extends U ? never : T;  // Remove types from T that are assignable to U
type T30 = Diff<"a" | "b" | "c" | "d", "a" | "c" | "f">;  // "b" | "d"

I want to do that except remove the properties of an object. How can I achieve the following:

type ObjectDiff<T, U> = /* ...pls help... */;

type A = { one: string; two: number; three: Date; };
type Stuff = { three: Date; };

type AWithoutStuff = ObjectDiff<A, Stuff>; // { one: string; two: number; }
1

There are 1 best solutions below

0
CRice On BEST ANSWER

Well, leveraging your Diff type from earlier (which by the way is the same as the Exclude type which is now part of the standard library), you can write:

type ObjectDiff<T, U> = Pick<T, Diff<keyof T, keyof U>>;
type AWithoutStuff = ObjectDiff<A, Stuff>; // inferred as { one: string; two: number; }