<?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 Фишка 🎯: satisfies против &quot;тихих&quot; ошибок]]></title><description><![CDATA[<p dir="auto">Опечатки в свойствах объектов — частая боль в TypeScript. Особенно коварны ошибки доступа к несуществующим полям, которые <strong>TypeScript не замечает</strong> при использовании интерфейсов.<br />
Оператор <code>satisfies</code> решает эту проблему, добавляя строгую проверку на этапе компиляции!</p>
<p dir="auto">Рассмотрим пример конфигурации API:</p>
<pre><code class="language-typescript">// Конфигурация API
interface ApiConfig {
    endpoints: Record&lt;string, string&gt;;
}

// Проблема: можно обратиться к несуществующему свойству без ошибки
const config1: ApiConfig = {
    endpoints: { users: "/api/users", posts: "/api/posts" }
};

// Далее в коде — опечатка остаётся незамеченной!
fetch(config1.endpoints.user); // Должно быть 'users' — но TypeScript не ругается!
</code></pre>
<p dir="auto">В данном случае мы определяем интерфейс <code>ApiConfig</code>, где <code>endpoints</code> — это объект со строковыми ключами и значениями. Однако, когда мы пытаемся получить доступ к несуществующему свойству (например, <code>user</code> вместо <code>users</code>), TypeScript не выдает ошибку. Это происходит потому, что тип <code>Record&lt;string, string&gt;</code> допускает любые строки как ключи, и компилятор не может проверить, действительно ли такое свойство существует.</p>
<p dir="auto"><strong>Решение</strong>: использование оператора <code>satisfies</code></p>
<p dir="auto">Чтобы решить эту проблему, можно использовать оператор <code>satisfies</code>. Этот оператор проверяет, удовлетворяет ли значение заданному типу, но при этом не изменяет фактический тип значения. Таким образом, он позволяет ловить опечатки на этапе компиляции.</p>
<pre><code class="language-typescript">// Решение: satisfies ловит опечатки ещё на этапе компиляции
const config2 = {
    endpoints: { users: "/api/users", posts: "/api/posts" }
} satisfies ApiConfig;

// Работает корректно
fetch(config2.endpoints.users); // ✅ Ошибок нет

// Ошибка типа — опечатка будет замечена!
fetch(config2.endpoints.user); // ❌ Ошибка TypeScript — перехватывает опечатку!
</code></pre>
<hr />
<h2>Как работает оператор <code>satisfies</code></h2>
<ol>
<li>
<p dir="auto"><strong>Проверка соответствия типа</strong>: Оператор <code>satisfies</code> проверяет, удовлетворяет ли значение указанному типу. Если значение не проходит проверку — компилятор выдаст ошибку.</p>
</li>
<li>
<p dir="auto"><strong>Не изменяет фактический тип</strong>: После применения <code>satisfies</code>, фактический тип значения остаётся тем же. Это отличает его от явного приведения (<code>as</code>), которое может «скрыть» структуру данных.</p>
</li>
<li>
<p dir="auto"><strong>Ловит опечатки</strong>: В нашем примере попытка обратиться к <code>user</code> вместо <code>users</code> вызовет ошибку компиляции, так как объект должен соответствовать <code>ApiConfig</code>.</p>
</li>
</ol>
<p dir="auto">Оператор <code>satisfies</code> — это мощный инструмент в TypeScript, который помогает предотвратить “тихие” ошибки и улучшить качество кода. Он особенно полезен при работе с конфигурациями, маршрутами, словарями и другими объектами, где важно сохранить строгую типизацию и при этом избежать чрезмерного аннотирования.</p>
]]></description><link>https://forum.exlends.ru/topic/192/typescript-fishka-satisfies-protiv-tihih-oshibok</link><generator>RSS for Node</generator><lastBuildDate>Tue, 26 May 2026 13:11:10 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/192.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 22 Jul 2025 10:56:48 GMT</pubDate><ttl>60</ttl></channel></rss>