Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Теорія множин». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)У TypeScript **типи можна розглядати як множини значень**: `string` - множина всіх рядків, `number` - множина всіх чисел, `never` - порожня множина, `unknown` - універсум (множина всіх можливих значень). **Ключове:** `union (|)` - це об'єднання множин (∪), а `intersection (&)` - це перетин множин (∩), точнісінько як в теорії множин.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## Основна ідея У TypeScript **типи можна розглядати як множини значень**. Тоді: - `string` - множина **всіх рядків** - `number` - множина **всіх чисел** - `"hello"` - підмножина (`{ "hello" }`) - `never` - **порожня множина** (не містить значень) - `unknown` - **універсум** (множина всіх можливих значень) На цьому тлі оператори `|` і `&` поводяться **точнісінько як операції над множинами**. --- ## 1. Union (`|`) = **Об'єднання множин** Union об'єднує всі можливі значення з обох множин. Тобто **значення може належати хоча б одному** з об'єднуваних типів. ```javascript type T = string | number; ``` У термінах множин: ```javascript T = Strings ∪ Numbers ``` `T` включає всі рядки **і** всі числа. Приклади: ```javascript let x: string | number; x = "hello"; // елемент множини рядків x = 42; // елемент множини чисел x = true; // не входить в об'єднання ``` --- ## 2. Intersection (`&`) = **Перетин множин** Intersection - це значення, які належать **одночасно обом** типам. ```javascript type T = A & B; ``` У термінах множин: ```javascript T = A ∩ B ``` `T` включає лише ті значення, що підходять **і типу A, і типу B** одночасно. --- ### Приклад: `string & number` ```javascript Strings ∩ Numbers = ∅ ``` Порожня множина -> у 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 \| B` | `A ∪ B` | Об'єднання типів | | `A & B` | `A ∩ B` | Перетин типів | | `never` | ∅ | Порожня множина | | `unknown` | Ω | Усі можливі значення | | `extends` | ⊆ | Перевірка підтипу / підмножини | --- ### Просте визначення: > **Union (**`\|`**)** - об'єднання типів: значення належить хоча б одній множині. > > **Intersection (**`&`**)** - перетин типів: значення повинне належати всім множинам одночасно. > > Це рівно ті самі операції, що й **об'єднання (∪)** та **перетин (∩)** в теорії множин.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.