Skip to main content

Теорія множин

Основна ідея

У TypeScript типи можна розглядати як множини значень. Тоді:

  • string - множина всіх рядків
  • number - множина всіх чисел
  • "hello" - підмножина ({ "hello" })
  • never - порожня множина (не містить значень)
  • unknown - універсум (множина всіх можливих значень)

На цьому тлі оператори | і & поводяться точнісінько як операції над множинами.


1. Union (|) = Об'єднання множин

Union об'єднує всі можливі значення з обох множин. Тобто значення може належати хоча б одному з об'єднуваних типів.

javascript
type T = string | number;

У термінах множин:

javascript
T = StringsNumbers

T включає всі рядки і всі числа.

Приклади:

javascript
let x: string | number; x = "hello"; // елемент множини рядків x = 42; // елемент множини чисел x = true; // не входить в об'єднання

2. Intersection (&) = Перетин множин

Intersection - це значення, які належать одночасно обом типам.

javascript
type T = A & B;

У термінах множин:

javascript
T = AB

T включає лише ті значення, що підходять і типу A, і типу B одночасно.


Приклад: string & number

javascript
StringsNumbers =

Порожня множина -> у TypeScript це never.

javascript
type Impossible = string & number; // never

Приклад: перетин об'єктів

javascript
type A = { name: string }; type B = { age: number }; type C = A & B; // { name: string; age: number }

Це "перетин множин об'єктів", де значення повинні задовольняти обидві умови -> містять обидва поля.


3. Математична аналогія

Операція TypeScriptМатематичний аналогСимволСенс
A | BОб'єднання множин«АБО» - елемент хоча б в одній з множин
A & BПеретин множин«І» - елемент одразу в обох множинах
neverПорожня множинаНе містить елементів
unknownУніверсум (усі значення)ΩМістить усе
extendsПідмножинаТип A - підтип B
A extends B ? X : YУмова належності-Якщо A ⊆ B, то X, інакше Y

4. Візуальна аналогія (діаграми Венна)

javascript
A = { string } B = { number }

Union:

javascript
_______ _______ ( ) ( ) \ / \ / \ A /___________\ B /

Усі елементи з A або B.

Intersection:

javascript
_______ _______ ( ) ( ) \ /¯¯¯¯¯¯¯¯\ / \ A / ∩ \ B / ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

Лише спільна частина.


5. Підмножини і "extends"

extends у TypeScript буквально відповідає поняттю "підмножина":

javascript
type A = "a" | "b"; type B = "a" | "b" | "c"; type Test = A extends B ? true : false; // true (A ⊆ B)

А от навпаки - ні:

javascript
type Test2 = B extends A ? true : false; // false (B ⊄ A)

6. Перетин і об'єднання на конкретних значеннях

javascript
type X = "a" | "b"; type Y = "b" | "c"; type Union = X | Y; // "a" | "b" | "c" -> ∪ type Intersection = X & Y; // "b" -> ∩
ТипМатематикаЗначення
Union"a" | "b" | "c"об'єднання всіх варіантів
Intersection"b"лише спільне

7. Інтуїтивне порівняння

КонцепціяUnion (|)Intersection (&)
Логічний зміст«АБО»«І»
Множиниоб'єднанняперетин
Типізаціязначення повинне бути хоча б одним типомзначення повинне задовольняти всі типи
Часто використовується дляваріантів, станів, enum-like типівкомбінування інтерфейсів, mixin-типів
Приклад"A" | "B"{A} & {B}

8. Чому перетин об'єктів - не те саме, що перетин множин значень

Важливо розуміти:

  • Для примітивів перетин = спільне значення.
  • Для об'єктів перетин - це об'єднання полів, тому що об'єкт повинен задовольняти всі обмеження одразу.

Це логічно еквівалентно перетину множин предикатів, а не самих значень.


ПІДСУМОК

TypeScriptТеорія множинСенс
A | BA ∪ BОб'єднання типів
A & BA ∩ BПеретин типів
neverПорожня множина
unknownΩУсі можливі значення
extendsПеревірка підтипу / підмножини

Просте визначення:

Union (\|) - об'єднання типів: значення належить хоча б одній множині.

Intersection (&) - перетин типів: значення повинне належати всім множинам одночасно.

Це рівно ті самі операції, що й об'єднання (∪) та перетин (∩) в теорії множин.

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

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

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