Skip to main content

Перетин примітивів

Коротка відповідь

Якщо об'єднати несумісні типи, наприклад:

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 & numberneverнесумісні типи
{ id: number } & { id: string }{ id: never }конфлікт по полю
{ name: string } & { age: number }{ name: string; age: number }сумісно
`(stringnumber) & (numberboolean)`

Коротко:

Якщо ти об'єднуєш типи, які не можуть існувати одночасно, TypeScript виводить never - тип, у якого немає можливих значень.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.