Get Required
Challenge
Implement the advanced util type GetRequired<T>, which remains all the required fields
For example
type I = GetRequired<{ foo: number; bar?: string }>; // expected to be { foo: number }
Solution
Der Trick bei dieser Herausforderung ist es, die Attribute zu finden, die nicht benötigt werden.
Hierzu kann man bei der Erstellung des Mapped Typs prüfen, ob das Entfernen eines Attributes immer noch dem gleichen Typ wie davor entspricht:
type TExample = { foo: number; bar?: string };
// Ergibt false, da { bar? : string} nicht mit TExample übereinstimmt
type TResult = Omit<TExample, "foo"> extends TExample ? true : false;
// Ergibt true, da { foo : string} mit TExample übereinstimmt. Dies liegt daran, dass 'bar' optional ist, d.h. wenn es wie in diesem Fall fehlt,
// die Bedingung trotzdem erfüllt bleibt.
type TResult = Omit<TExample, "bar"> extends TExample ? true : false;
Somit kann man einfach prüfen, ob nach dem Entfernen eines Attributes noch weiterhin die Typen übereinstimmen und man erhält somit alle Attribute, die ‘Pflicht’ sind.
type GetRequired<T> = {
[Key in keyof T as Omit<T, Key> extends T ? never : Key]: T[Key];
};