Перетин примітивів
Коротка відповідь
Якщо об'єднати несумісні типи, наприклад:
type Impossible = string & number;Результатом буде тип never.
Чому так відбувається
Оператор & (intersection) означає «і те, і те одночасно».
TypeScript намагається створити тип, який відповідає всім об'єднуваним типам одразу.
stringозначає «будь-який рядок»numberозначає «будь-яке число»
Але значення не може бути одночасно рядком і числом,
тому перетин порожній, і TypeScript виводить тип never.
Приклад 1. Пряме перетинання несумісних типів
type A = string & number; // => never
let x: A;
// x = "text"; помилка
// x = 123; помилка
// x = null; помилкаТип
Aдорівнюєnever, тобто значення неможливе. TypeScript не дозволить присвоїти нічого.
Приклад 2. Перетин частково сумісних типів
Іноді частина властивостей перетинається, і TypeScript залишає лише спільні поля.
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. Перетин з конфліктуючими типами властивостей
type A = { id: number };
type B = { id: string };
type C = A & B;
// id повинен бути і number, і string -> несумісноТепер C["id"] = number & string -> never.
Отже, весь тип:
type C = { id: never };Неможливо створити коректне значення:
const obj: C = { id: 123 }; // помилка
const obj2: C = { id: "123" }; // помилкаПриклад 4. Перетин union-типів
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- тип, у якого немає можливих значень.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.