<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Typescript: Union Type vs Enum]]></title><description><![CDATA[<p dir="auto">Часто объединенные типы <code>Union Type</code> и перечисляемый тип <code>Enum</code> - это онди из способов обеспечения типобезопасности  кода, в частности типизация ограниченного списка каких либо значений.</p>
<p dir="auto">Они также оба хорошо работают с современными IDE предлагая в подсказках отфильтрованные значения.</p>
<p dir="auto">Но бывает задаешься вопросом: что лучше использовать в той или иной ситуации?</p>
<h2>Разница в размере кода</h2>
<p dir="auto">Объединенные типы не будут создавать какой либо дополнительный код.<br />
Вот Простой пример:</p>
<p dir="auto"><strong>Версия с Union Type</strong></p>
<pre><code class="language-ts">type VehicleTypeUnion = 'SUV' | 'SEDAN' | 'TRUCK';
const a: VehicleTypeUnion = 'SUV'
</code></pre>
<p dir="auto">-&gt;</p>
<pre><code class="language-ts">"use strict";
const a = 'SUV';

</code></pre>
<p dir="auto"><strong>Версия с Enum</strong></p>
<pre><code class="language-ts">enum VehicleTypeEnum {
  SUV,
  SEDAN,
  TRUCK,
}

const b: VehicleTypeEnum = VehicleTypeEnum.SUV
</code></pre>
<p dir="auto">-&gt;</p>
<pre><code class="language-js">var VehicleTypeEnum;
(function (VehicleTypeEnum) {
    VehicleTypeEnum[VehicleTypeEnum["SUV"] = 0] = "SUV";
    VehicleTypeEnum[VehicleTypeEnum["SEDAN"] = 1] = "SEDAN";
    VehicleTypeEnum[VehicleTypeEnum["TRUCK"] = 2] = "TRUCK";
})(VehicleTypeEnum || (VehicleTypeEnum = {}));
const b = VehicleTypeEnum.SUV;
</code></pre>
<h2>Разные типы в списке значений</h2>
<p dir="auto">перечисляемый тип обычно описывается в виде числовых значений или в виде строковых.</p>
<pre><code class="language-ts">
// список
enum VehicleType1 {
  SUV,
  SEDAN,
  TRUCK,
  BUS,
  MOTORCYCLE
}

// эквивалентный список
enum VehicleType2{
  SUV = 0,
  SEDAN = 1,
  TRUCK = 2,
  BUS = 3,
  MOTORCYCLE = 4
}

// список со строковыми значениями
enum VehicleType3{
  SUV = 'SUV',
  SEDAN = 'SEDAN',
  TRUCK = 'TRUCK',
  BUS = 'BUS',
  MOTORCYCLE = 'MOTORCYCLE'
}
</code></pre>
<p dir="auto">-&gt;</p>
<pre><code class="language-js">"use strict";
// перечисляемый тип
var VehicleType1;
(function (VehicleType1) {
    VehicleType1[VehicleType1["SUV"] = 0] = "SUV";
    VehicleType1[VehicleType1["SEDAN"] = 1] = "SEDAN";
    VehicleType1[VehicleType1["TRUCK"] = 2] = "TRUCK";
    VehicleType1[VehicleType1["BUS"] = 3] = "BUS";
    VehicleType1[VehicleType1["MOTORCYCLE"] = 4] = "MOTORCYCLE";
})(VehicleType1 || (VehicleType1 = {}));

// эквивалентный тип
var VehicleType2;
(function (VehicleType2) {
    VehicleType2[VehicleType2["SUV"] = 0] = "SUV";
    VehicleType2[VehicleType2["SEDAN"] = 1] = "SEDAN";
    VehicleType2[VehicleType2["TRUCK"] = 2] = "TRUCK";
    VehicleType2[VehicleType2["BUS"] = 3] = "BUS";
    VehicleType2[VehicleType2["MOTORCYCLE"] = 4] = "MOTORCYCLE";
})(VehicleType2 || (VehicleType2 = {}));

// тип со строковыми значениями
var VehicleType3;
(function (VehicleType3) {
    VehicleType3["SUV"] = "SUV";
    VehicleType3["SEDAN"] = "SEDAN";
    VehicleType3["TRUCK"] = "TRUCK";
    VehicleType3["BUS"] = "BUS";
    VehicleType3["MOTORCYCLE"] = "MOTORCYCLE";
})(VehicleType3 || (VehicleType3 = {}));

</code></pre>
<p dir="auto">Первый тип мы  описали без инициализирующих значений,  его значения инициализируются автоматически, в зависимости от порядка, поэтому порядок значений менять <strong>опасно!</strong></p>
<p dir="auto">Это также накладывает ограничение, что мы не можем использовать тип с проинициализированными значениями и без:</p>
<pre><code class="language-ts">enum VehicleType {
  SUV = 'SUV',
  SEDAN = 'SEDAN',
  TRUCK = 'TRUCK',
  BUS = 'BUS',
  MOTORCYCLE
}
</code></pre>
<p dir="auto">Выведет ошибку  <code>error TS1061: Enum member must have initializer.</code></p>
<p dir="auto">Вам придется описать тип так:</p>
<pre><code class="language-ts">enum VehicleType {
  SUV = 'SUV',
  SEDAN = 'SEDAN',
  TRUCK = 'TRUCK',
  BUS = 'BUS',
  MOTORCYCLE = 0,
}

</code></pre>
<h4>Union Type</h4>
<p dir="auto">Тут вы можете создавать объединения с другими типами значений, отличными от строк:</p>
<pre><code class="language-ts">type VehicleType = 'SUV' | 'SEDAN' | 'TRUCK' | 0 | [];
</code></pre>
<p dir="auto">Это дает вам дополнительную гибкость в определении типов. Однако такая дополнительная гибкость может привести к неожиданному поведению в коде при отсутствии четкого понимания типа переменной, которая может быть строкой, или числом, или массивом объектов и т.д.</p>
<h2>Перебор значений</h2>
<p dir="auto">Перечисления - это объекты, где каждому ключу свойства может быть автоматически присвоено значение или строка на случай, если мы определим значение вручную. Следовательно, вы можете повторять значения свойств точно так же, как и любой другой объект:</p>
<pre><code class="language-ts">export enum VehicleType {
  SUV = 'SUV',
  SEDAN = 'SEDAN',
  TRUCK = 'TRUCK',
  BUS = 'BUS',
  MOTORCYCLE = 'MOTORCYCLE'
}

for (const type in VehicleType) {
  console.log(type);
}

Object.keys(VehicleType).forEach((key) =&gt; {
  console.log('key ', key);
})

</code></pre>
<p dir="auto">Попытка сделать что-то подобное с union types приведет к ошибке при попытке выполнения кода</p>
<pre><code class="language-ts">type VehicleType = 'SUV' | 'SEDAN' | 'TRUCK' | 'BUS' | 'MOTORCYCLE';

for (const type in VehicleType) {
  // my logic in here
  console.log(type);
}

Object.keys(VehicleType).forEach((key) =&gt; {
  console.log('key ', key);
})
</code></pre>
<p dir="auto"><code>error TS2693: 'VehicleType' only refers to a type, but is being used as a value here.</code></p>
<h2>Вывод</h2>
<p dir="auto">Если вам нужно будет выполнять итерации по набору значений, лучше всего использовать <code>enums</code>,  но вы тем самым пожертвуете размером собранного кода.</p>
]]></description><link>https://forum.exlends.ru/topic/16/typescript-union-type-vs-enum</link><generator>RSS for Node</generator><lastBuildDate>Thu, 21 May 2026 04:02:18 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/16.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 24 Jun 2024 13:15:28 GMT</pubDate><ttl>60</ttl></channel></rss>