Exclude

Challenge

Implement the built-in Exclude<T, U>

Exclude from T those types that are assignable to U

For example:

type Result = MyExclude<"a" | "b" | "c", "a">; // 'b' | 'c'

Solution

Solution

Zur Lösung dieses Problems sollte man wissen, dass Vereinigungen (Union) in konditionellen Typen distributiv sind. Damit ist gemeint, dass eine Kondition für jedes Element einer Vereinigung geprüft wird. TypeScript iteriert somit über die Vereinigung und wendet die Bedingung für jedes Element der Vereinigung an. Anschließend werden die Ergebnisse wieder zusammengefügt.

// Falls T = 'a' | 'b' => 'a' extends U ? , 'b' extends U ?
T extends U ?

Für die Lösung müssen wir also nur noch prüfen, ob T ein Subtyp von U ist, TypScript übernimmt die Prüfung für das Element der Vereinigung:

type MyExclude<T, U> = T extends U ? never : T;

References

https://www.typescriptlang.org/docs/handbook/2/conditional-types.html#distributive-conditional-types