Завдання

Реалізувати вбудований тип Exclude<T, U>.

Виключити з типу T ті типи, що є присвоюваними в U

type T0 = Exclude<"a" | "b" | "c", "a">; // "b" | "c"
type T1 = Exclude<"a" | "b" | "c", "a" | "b">; // "c"

Розв’язок

Для вирішення цього завдання важливо знати, що умовні типи в TypeScript дистрибутивні.

Тож, коли ви пишете T extends U, де T є об’єднанням, TypeScript застосує умову до кожного елементу з T.

Зважаючи на це, рішення виглядатиме просто. Ми перевірятимемо, чи T можна присвоїти в тип U і, якщо це так, будемо пропускати T, повертаючи never. Іншими словами, це означає, що поточний елемент із T не знаходиться в U, а отже ми можемо повернути його:

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

Посилання