PickByType

Challenge

From T, pick a set of properties whose type are assignable to U.

For Example

type OnlyBoolean = PickByType<
  {
    name: string;
    count: number;
    isReadonly: boolean;
    isEnable: boolean;
  },
  boolean
>; // { isReadonly: boolean; isEnable: boolean; }

Solution

Zur Lösung dieses Problems erstellen wir einen Mapped Type, bei dem wir schon bei der Iteration über die Eigenschaften / Schlüssel auf den Wert des Attributes prüfen, und die Kombination aus Eigenschaft + Wert nur dann im neuen Typ aufnehmen, wenn der Wert nicht U entspricht.

type PickByType<T, U> = {
  [key in keyof T as T[key] extends U ? key : never]: T[key];
};

References