Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Перетин примітивів». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Якщо перетнути **несумісні типи**, наприклад `type Impossible = string & number`, результатом буде тип **`never`**. **Ключове:** оператор `&` (intersection) означає «і те, і те одночасно», а оскільки значення не може бути одночасно рядком і числом, перетин порожній, і TypeScript виводить `never` - тип, у якого немає можливих значень.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## Коротка відповідь Якщо об'єднати **несумісні типи**, наприклад: ```javascript type Impossible = string & number; ``` Результатом буде тип `never`. --- ## Чому так відбувається Оператор `&` (intersection) означає **«і те, і те одночасно»**. TypeScript намагається створити тип, який **відповідає всім об'єднуваним типам одразу**. - `string` означає «будь-який рядок» - `number` означає «будь-яке число» Але значення **не може бути одночасно рядком і числом**, тому **перетин порожній**, і TypeScript виводить тип `never`. --- ## Приклад 1. Пряме перетинання несумісних типів ```javascript type A = string & number; // => never let x: A; // x = "text"; помилка // x = 123; помилка // x = null; помилка ``` > Тип `A` дорівнює `never`, тобто значення **неможливе**. > TypeScript не дозволить присвоїти **нічого**. --- ## Приклад 2. Перетин частково сумісних типів Іноді частина властивостей перетинається, і TypeScript залишає лише **спільні** поля. ```javascript type A = { id: number; name: string }; type B = { id: number; age: number }; type C = A & B; /* C = { id: number; // спільне поле name: string; // з A age: number; // з B } */ const person: C = { id: 1, name: "Tim", age: 25 }; // OK ``` > Тут усе сумісно - TypeScript просто об'єднав властивості. --- ## Приклад 3. Перетин з конфліктуючими типами властивостей ```javascript type A = { id: number }; type B = { id: string }; type C = A & B; // id повинен бути і number, і string -> несумісно ``` Тепер `C["id"]` = `number & string` -> `never`. Отже, весь тип: ```javascript type C = { id: never }; ``` Неможливо створити коректне значення: ```javascript const obj: C = { id: 123 }; // помилка const obj2: C = { id: "123" }; // помилка ``` --- ## Приклад 4. Перетин union-типів ```javascript type A = string | number; type B = number | boolean; type C = A & B; // => number ``` Тут TypeScript обчислює **спільну частину двох множин**: - A = { string, number } - B = { number, boolean } - Перетин = { number } --- ## Логічне порівняння | Тип операції | Символ | Логіка | |---|---|---| | ` | ` (union) | АБО | | `&` (intersection) | І | Бере лише те, що підходить усім одночасно | --- ## Підсумок | Вираз | Результат | Пояснення | |---|---|---| | `string & number` | `never` | несумісні типи | | `{ id: number } & { id: string }` | `{ id: never }` | конфлікт по полю | | `{ name: string } & { age: number }` | `{ name: string; age: number }` | сумісно | | `(string | number) & (number | boolean)` | --- ### Коротко: > Якщо ти об'єднуєш типи, які **не можуть існувати одночасно**, > TypeScript виводить `never` - тип, у якого **немає можливих значень**.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.