<?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[Type vs Interface в TypeScript — выбор и различия]]></title><description><![CDATA[<p dir="auto"><strong>TypeScript</strong> предоставляет два мощных механизма для определения типов: <strong>type</strong> и <strong>interface</strong>. Оба позволяют создавать типы, которые описывают структуры объектов, функций и других данных. Однако между ними существуют тонкие различия, которые могут повлиять на выбор инструмента в зависимости от задачи. Давайте разберемся, чем они отличаются и когда что использовать.</p>
<h2>Что такое type и interface?</h2>
<p dir="auto"><strong>type (тип)</strong></p>
<p dir="auto">Ключевое слово type создает алиас (псевдоним) для существующего типа или определяет новый тип через комбинацию других типов. Например:</p>
<pre><code class="language-typescript">type Name = string;
type Coordinates = { x: number; y: number };
</code></pre>
<p dir="auto"><strong>interface (интерфейс)</strong></p>
<p dir="auto">Интерфейс описывает форму объекта, включая его свойства и методы. Интерфейсы могут быть расширены или реализованы классами:</p>
<pre><code class="language-typescript">interface User {
  name: string;
  age: number;
}
</code></pre>
<h2>Ключевые различия между type и interface</h2>
<p dir="auto"><strong>Расширение типов</strong></p>
<ul>
<li><strong>interface</strong> : Поддерживает множественное наследование через <code>extends</code>.</li>
</ul>
<pre><code class="language-typescript">
interface Animal {
  name: string;
}

interface Dog extends Animal {
  breed: string;
}
</code></pre>
<ul>
<li><strong>type</strong> : Использует оператор <code>&amp;</code> (пересечение типов) для комбинации.</li>
</ul>
<pre><code class="language-typescript">type Animal = {
  name: string;
};

type Dog = Animal &amp; {
  breed: string;
};
</code></pre>
<p dir="auto"><strong>Union и Intersection Types</strong></p>
<ul>
<li><strong>type</strong> : Позволяет создавать объединения (<code>|</code>) и пересечения (<code>&amp;</code>) типов.</li>
</ul>
<pre><code class="language-typescript">type ID = string | number; // Union type
type ButtonProps = BaseProps &amp; { color: string }; // Intersection type
</code></pre>
<ul>
<li><strong>interface</strong> : Не поддерживает объединения напрямую. Может расширять несколько интерфейсов, но не примитивы или другие типы.</li>
</ul>
<p dir="auto"><strong>Declaration Merging (Объединение объявлений)</strong></p>
<ul>
<li><strong>interface</strong> : Поддерживает декларативное объединение . Если несколько интерфейсов с одинаковым именем, TypeScript автоматически объединит их:</li>
</ul>
<pre><code class="language-typescript">interface User {
  name: string;
}

interface User {
  age: number;
}

const user: User = { name: "Alice", age: 30 }; // Работает!
</code></pre>
<ul>
<li>type : Не позволяет повторно объявлять одно и то же имя:</li>
</ul>
<pre><code class="language-typescript">type User = { name: string };
type User = { age: number }; // ❌ Ошибка: Имя "User" уже объявлено.
</code></pre>
<p dir="auto"><strong>Использование с примитивами</strong></p>
<ul>
<li><strong>type</strong> : Может создавать псевдонимы для примитивов:</li>
</ul>
<pre><code class="language-typescript">type Score = number;
</code></pre>
<ul>
<li><strong>interface</strong> : Не может заменять примитивы.</li>
</ul>
<p dir="auto"><strong>Реализация в классах</strong></p>
<ul>
<li><strong>interface</strong> : Может быть реализован классом через <code>implements</code>:</li>
</ul>
<pre><code class="language-typescript">class Person implements User {
  name: string;
}
</code></pre>
<ul>
<li><strong>type</strong> : Обычные типы-объекты также поддерживают implements, но union-типы — нет:</li>
</ul>
<pre><code class="language-typescript">type User = { name: string };
class Person implements User { /* Работает */ }

type ID = string | number;
class Entity implements ID { /* ❌ Ошибка */ }
</code></pre>
<h2>Когда что использовать?</h2>
<p dir="auto">Используйте <strong>interface</strong>, если:</p>
<ul>
<li>Вам нужна поддержка декларативного объединения (например, для расширения библиотечных типов).</li>
<li>Вы работаете с классами , реализующими интерфейс.</li>
<li>Требуется наследование нескольких интерфейсов.</li>
</ul>
<p dir="auto">Используйте <strong>type</strong>, если:</p>
<ul>
<li>Нужны union-типы (<code>|</code>) или intersection-типы (<code>&amp;</code>).</li>
<li>Вы создаете псевдоним для примитива, сложного типа или функции:</li>
</ul>
<pre><code class="language-typescript">type Callback = (error: Error | null, data: string) =&gt; void;
</code></pre>
<ul>
<li>Вы предпочитаете иммутабельность типов (избегаете случайного изменения через повторные объявления).</li>
</ul>
<h2>Примеры из практики</h2>
<p dir="auto"><strong>Union Types (только type)</strong></p>
<pre><code class="language-typescript">
type Theme = "light" | "dark";
function setTheme(theme: Theme) { /* ... */ }
</code></pre>
<p dir="auto"><strong>Расширение интерфейсов</strong></p>
<pre><code class="language-typescript">interface FormProps {
  onSubmit: () =&gt; void;
}

interface LoginFormProps extends FormProps {
  username: string;
}
</code></pre>
<p dir="auto"><strong>Декларативное объединение</strong></p>
<pre><code class="language-typescript">interface Window {
  myPlugin: PluginAPI;
}
// В другом файле:
interface Window {
  myPlugin: PluginAPI; // Расширение существующего интерфейса
}
</code></pre>
<h2>Заключение</h2>
<p dir="auto">Выбор между type и interface часто зависит от контекста и предпочтений команды. Вот краткий чек-лист:</p>
<ul>
<li>Для объектных структур и наследования — interface.</li>
<li>Для union/intersection типов , псевдонимов и функциональных типов — type.</li>
</ul>
<p dir="auto">Оба подхода дополняют друг друга, и их совместное использование позволяет писать гибкий и типобезопасный код. Главное — соблюдать консистентность в проекте и документировать принятые стандарты.</p>
<h3>Дополнительные ресурсы:</h3>
<ul>
<li><a href="https://www.typescriptlang.org/docs/handbook/interfaces.html?spm=a2ty_o01.29997173.0.0.4751c921aBx4qi" target="_blank" rel="noopener noreferrer">Официальная документация TypeScript: Types vs Interfaces</a></li>
<li><a href="https://www.typescriptlang.org/docs/handbook/advanced-types.html?spm=a2ty_o01.29997173.0.0.4751c921aBx4qi" target="_blank" rel="noopener noreferrer">Advanced Types in TypeScript</a></li>
</ul>
]]></description><link>https://forum.exlends.ru/topic/141/type-vs-interface-v-typescript-vybor-i-razlichiya</link><generator>RSS for Node</generator><lastBuildDate>Thu, 18 Jun 2026 11:31:54 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/141.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Jun 2025 15:36:25 GMT</pubDate><ttl>60</ttl></channel></rss>