<?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[Что делает и для чего нужен Record&lt;&gt; в TypeScript?]]></title><description><![CDATA[<p dir="auto">Давайте разбираться <code>Record&lt;Keys, Type&gt;</code> - это встроенный utility type в TypeScript, который создает объектный тип-словарь с фиксированным типом ключей и фиксированным типом значений.</p>
<p dir="auto">Для не понимающих:</p>
<pre><code class="language-ts">Record&lt;ТипКлюча, ТипЗначения&gt;
</code></pre>
<p dir="auto">Объекты все помнят? Ключ -&gt; значение.</p>
<p dir="auto">Под капотом конечно страшненький отображаемый тип:</p>
<pre><code class="language-ts">type Record&lt;K extends keyof any, T&gt; = {
  [P in K]: T;
};
</code></pre>
<p dir="auto">Ладно, теперь давай разберем далее несколько примеров, с простой типизацией и с типизацией более боевой что используется в реальных проектах.</p>
<h3>Базовое использование:</h3>
<pre><code class="language-ts">const scores: Record&lt;string, number&gt; = {
  alex: 3,
  max: 8,
  kate: 5,
};
</code></pre>
<p dir="auto">Обратим внимание на сие простой объект с использованием <code>Record&lt;&gt;</code> теперь картина стала понятнее? У нас есть объект как всегда ключ -&gt; значение, а <code>Record</code> сразу добавляет к ним типизацию.</p>
<h3>Более приемлемый вариант</h3>
<p dir="auto">Представим что у нас есть где-то типы, пусть будут как всегда <code>User</code>, то тогда наш объект должен выглядеть так:</p>
<pre><code class="language-ts">type User = {
  name: string;
  age: number;
}
export type { User }
</code></pre>
<p dir="auto">Как обычно типы экспортируем</p>
<p dir="auto">Далее их импортируем, и вот смотрите как красиво получается типизировать наш объект через <code>Record</code></p>
<pre><code class="language-ts">import type { User } from "@/types"

const scores: Record&lt;string, User&gt; = {
  user1: { name: 'Alex', age: 30 },
  user2: { name: 'Max',  age: 25 },
  user3: { name: 'Kate', age: 28 },
}
</code></pre>
<h3>А без Record можно?</h3>
<p dir="auto">А то, конечно можно, но вопрос надо ли оно нам?<br />
Вот пару способов:</p>
<pre><code class="language-ts">// 1. Индексная сигнатура - ну классика
const scores: { [key: string]: number } = {
  alex: 3,
  max: 8,
  kate: 5,
};

// 2. Через interface
interface Scores {
  [key: string]: number;
}
const scores: Scores = {
  alex: 3,
  max: 8,
  kate: 5,
};
</code></pre>
<p dir="auto">Думаю у многих будет один и тот же вопрос, а моги я сделать так:</p>
<pre><code class="language-ts">interface Scores {
  name: number;
}

const scores: Scores = {
  name: 42, // Если тут будет name, а не alex - то сработает
  max: 3,
  kate: 8,
};
</code></pre>
<p dir="auto">Нет, не можете - потому что <code>name: number</code> описывает конкретное поле с именем name. <strong>TypeScript</strong> не разрешит добавить <code>max</code> или <code>kate</code>, так как их нет в интерфейсе. Для динамических ключей нужна индексная сигнатура <code>[key: string]</code>.</p>
<p dir="auto">По сути Record - это короткая запись для индексной сигнатуры. Квадратные скобки <code>[key: string]</code> говорят TS: “Эй мужик, ключи могут быть любыми строками”, а тип после двоеточия задает тип значений. <code>Record&lt;string, number&gt;</code> - это то же самое что <code>{ [key: string]: number }</code>, только читается лучше и легче.</p>
<p dir="auto">Главное разобраться в самом начале - потом уже будете использовать по наитию.</p>
]]></description><link>https://forum.exlends.com/topic/2207/chto-delaet-i-dlya-chego-nuzhen-record-v-typescript</link><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Apr 2026 12:57:30 GMT</lastBuildDate><atom:link href="https://forum.exlends.com/topic/2207.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 28 Apr 2026 13:10:16 GMT</pubDate><ttl>60</ttl></channel></rss>