Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що робить Omit<T, K>?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**`Omit<T, K>`** створює новий тип на основі `T`, **виключаючи** з нього властивості, перелічені в `K`. **Ключове:** `Pick` "бере потрібне", а `Omit` "прибирає зайве" - вони протилежні за призначенням.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## 1. Що робить `Omit<T, K>` > `Omit<T, K>` - створює новий тип на основі `T`, > **виключаючи** з нього властивості, перелічені в `K`. --- ### Синтаксис ```javascript Omit<Тип_джерело, 'ключ1' | 'ключ2'> ``` --- ### Приклад ```javascript interface User { id: number; name: string; email: string; password: string; } type PublicUser = Omit<User, 'password'>; ``` Тепер `PublicUser` еквівалентний: ```javascript { id: number; name: string; email: string; } ``` > Поле `password` виключено з типу. --- ## 2. Чим `Omit` протилежний `Pick` | Утиліта | Що робить | Приклад | |---|---|---| | `Pick<T, K>` | **залишає лише вказані** властивості | `Pick<User, 'id' \| 'name'>` | | `Omit<T, K>` | **видаляє вказані** властивості | `Omit<User, 'password'>` | Візуально: ```javascript interface User { id: number; name: string; email: string; password: string; } // Pick type MinimalUser = Pick<User, 'id' | 'name'>; // { id: number; name: string } // Omit type SafeUser = Omit<User, 'password'>; // { id: number; name: string; email: string } ``` > Тобто: > **Pick = "взяти потрібне"**, > **Omit = "прибрати зайве"**. --- ## 3. Як `Omit<T, K>` працює всередині Реалізація `Omit` на рівні мови виглядає так: ```javascript type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>; ``` Що відбувається: 1. `keyof T` - бере всі ключі вихідного типу. 2. `Exclude<keyof T, K>` - виключає з них ті, що вказані в `K`. 3. `Pick<...>` - створює новий тип на основі властивостей, що залишилися. --- ## 4. Чи можна видалити кілька властивостей за допомогою `Omit` Так, можна вказати одразу кілька властивостей через об'єднання (`|`): ```javascript type UserWithoutSensitive = Omit<User, 'password' | 'email'>; ``` Вийде: ```javascript { id: number; name: string; } ``` > TypeScript видалить **усі перелічені поля** з результувального типу. --- ## 5. Приклад використання в реальних проєктах ### Видалення чутливих даних ```javascript interface Employee { id: number; name: string; email: string; salary: number; } type PublicEmployee = Omit<Employee, 'salary'>; ``` > Такий тип зручно використовувати для безпечного повернення даних з API. --- ### Спрощені форми ```javascript interface FormData { id: number; name: string; createdAt: Date; updatedAt: Date; } type FormInput = Omit<FormData, 'id' | 'createdAt' | 'updatedAt'>; ``` > Для форми потрібні лише поля вводу (`name`), > а решта генерується автоматично. --- ## 6. Помилка при неіснуючому ключі Якщо ти спробуєш видалити поле, якого немає в типі, TypeScript одразу покаже помилку: ```javascript type Wrong = Omit<User, 'nickname'>; // Error: Type '"nickname"' is not assignable to keyof 'User' ``` > Тобто `Omit` перевіряє, що вказані ключі справді існують у `T`. --- ## Підсумок | Питання | Відповідь | |---|---| | Що робить `Omit<T, K>` | Створює новий тип без указаних властивостей | | Чим відрізняється від `Pick` | `Pick` обирає потрібні поля, `Omit` - видаляє зайві | | Чи можна видалити кілька властивостей | Так, через `'prop1' \| 'prop2'` | | Що буде, якщо видалити неіснуюче | Помилка: ключ не знайдено в типі |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.