{"componentChunkName":"component---src-templates-blog-post-js","path":"/javascript/TypeScript-완전정복-타입-시스템부터-고급-패턴까지/","result":{"data":{"site":{"siteMetadata":{"title":"Bottlehs Tech Blog","description":"웹·앱·AI 개발자 전병훈(bottlehs)의 기술 블로그. AI·LLM, JavaScript·Vue, Spring Boot, 알고리즘, 블록체인 실무 가이드를 다룹니다","siteUrl":"https://www.bottlehs.dev","author":{"name":"Jeon Byung Hun","summary":"개발을 즐기는 bottlehs - Engineer, MS, AI, FE, BE, OS, IOT, Blockchain, 설계, 테스트"},"social":{"github":"bottlehs","codepen":"bottlehs"}}},"markdownRemark":{"id":"8b42c816-cab8-5f97-bd51-63c5795d8f13","excerpt":"TypeScript 완전정복 - 타입 시스템부터 고급 패턴까지 TypeScript는 JavaScript에 정적 타입을 추가한 언어로, 대규모 애플리케이션 개발에서 필수적인 도구가 되었다. 이 글은 TypeScript의 기본 개념부터 고급 패턴까지 실전 예제와 함께 완벽하게 정리한다.…","html":"<h1 id=\"typescript-완전정복---타입-시스템부터-고급-패턴까지\" style=\"position:relative;\"><a href=\"#typescript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5---%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80\" aria-label=\"typescript 완전정복   타입 시스템부터 고급 패턴까지 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>TypeScript 완전정복 - 타입 시스템부터 고급 패턴까지</h1>\n<p>TypeScript는 JavaScript에 정적 타입을 추가한 언어로, 대규모 애플리케이션 개발에서 필수적인 도구가 되었다. 이 글은 TypeScript의 기본 개념부터 고급 패턴까지 실전 예제와 함께 완벽하게 정리한다.</p>\n<h2 id=\"1-typescript-기본-타입-시스템\" style=\"position:relative;\"><a href=\"#1-typescript-%EA%B8%B0%EB%B3%B8-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C\" aria-label=\"1 typescript 기본 타입 시스템 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. TypeScript 기본 타입 시스템</h2>\n<h3 id=\"1-1-기본-타입\" style=\"position:relative;\"><a href=\"#1-1-%EA%B8%B0%EB%B3%B8-%ED%83%80%EC%9E%85\" aria-label=\"1 1 기본 타입 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1-1. 기본 타입</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// 원시 타입</span>\n<span class=\"token keyword\">let</span> name<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"TypeScript\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> age<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span> <span class=\"token operator\">=</span> <span class=\"token number\">10</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> isActive<span class=\"token operator\">:</span> <span class=\"token builtin\">boolean</span> <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> data<span class=\"token operator\">:</span> <span class=\"token keyword\">null</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> value<span class=\"token operator\">:</span> <span class=\"token keyword\">undefined</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">undefined</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 배열</span>\n<span class=\"token keyword\">let</span> numbers<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> names<span class=\"token operator\">:</span> <span class=\"token builtin\">Array</span><span class=\"token operator\">&lt;</span><span class=\"token builtin\">string</span><span class=\"token operator\">></span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"Alice\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Bob\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 튜플</span>\n<span class=\"token keyword\">let</span> tuple<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"hello\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">42</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 열거형</span>\n<span class=\"token keyword\">enum</span> Color <span class=\"token punctuation\">{</span>\n  Red <span class=\"token operator\">=</span> <span class=\"token string\">\"RED\"</span><span class=\"token punctuation\">,</span>\n  Green <span class=\"token operator\">=</span> <span class=\"token string\">\"GREEN\"</span><span class=\"token punctuation\">,</span>\n  Blue <span class=\"token operator\">=</span> <span class=\"token string\">\"BLUE\"</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// any와 unknown</span>\n<span class=\"token keyword\">let</span> anyValue<span class=\"token operator\">:</span> <span class=\"token builtin\">any</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"anything\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> unknownValue<span class=\"token operator\">:</span> <span class=\"token builtin\">unknown</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"unknown\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// void와 never</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">noReturn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"no return\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">neverReturns</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">never</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"never returns\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"1-2-타입-추론\" style=\"position:relative;\"><a href=\"#1-2-%ED%83%80%EC%9E%85-%EC%B6%94%EB%A1%A0\" aria-label=\"1 2 타입 추론 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1-2. 타입 추론</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// 타입 추론</span>\n<span class=\"token keyword\">let</span> inferredString <span class=\"token operator\">=</span> <span class=\"token string\">\"hello\"</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// string으로 추론</span>\n<span class=\"token keyword\">let</span> inferredNumber <span class=\"token operator\">=</span> <span class=\"token number\">42</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// number로 추론</span>\n\n<span class=\"token comment\">// 명시적 타입 지정</span>\n<span class=\"token keyword\">let</span> explicitString<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"hello\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 함수 반환 타입 추론</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>a<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">,</span> b<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> a <span class=\"token operator\">+</span> b<span class=\"token punctuation\">;</span> <span class=\"token comment\">// 반환 타입: number</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 명시적 반환 타입</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">multiply</span><span class=\"token punctuation\">(</span>a<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">,</span> b<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">number</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> a <span class=\"token operator\">*</span> b<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"1-3-유니온과-인터섹션-타입\" style=\"position:relative;\"><a href=\"#1-3-%EC%9C%A0%EB%8B%88%EC%98%A8%EA%B3%BC-%EC%9D%B8%ED%84%B0%EC%84%B9%EC%85%98-%ED%83%80%EC%9E%85\" aria-label=\"1 3 유니온과 인터섹션 타입 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1-3. 유니온과 인터섹션 타입</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// 유니온 타입 (또는)</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">StringOrNumber</span> <span class=\"token operator\">=</span> <span class=\"token builtin\">string</span> <span class=\"token operator\">|</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">processValue</span><span class=\"token punctuation\">(</span>value<span class=\"token operator\">:</span> StringOrNumber<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">typeof</span> value <span class=\"token operator\">===</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> value<span class=\"token punctuation\">.</span><span class=\"token function\">toUpperCase</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> value<span class=\"token punctuation\">.</span><span class=\"token function\">toFixed</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 인터섹션 타입 (그리고)</span>\n<span class=\"token keyword\">interface</span> <span class=\"token class-name\">Person</span> <span class=\"token punctuation\">{</span>\n  name<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span>\n  age<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">interface</span> <span class=\"token class-name\">Employee</span> <span class=\"token punctuation\">{</span>\n  employeeId<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span>\n  department<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">EmployeePerson</span> <span class=\"token operator\">=</span> Person <span class=\"token operator\">&amp;</span> Employee<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> employee<span class=\"token operator\">:</span> EmployeePerson <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  name<span class=\"token operator\">:</span> <span class=\"token string\">\"Alice\"</span><span class=\"token punctuation\">,</span>\n  age<span class=\"token operator\">:</span> <span class=\"token number\">30</span><span class=\"token punctuation\">,</span>\n  employeeId<span class=\"token operator\">:</span> <span class=\"token string\">\"E001\"</span><span class=\"token punctuation\">,</span>\n  department<span class=\"token operator\">:</span> <span class=\"token string\">\"Engineering\"</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"2-인터페이스와-타입-별칭\" style=\"position:relative;\"><a href=\"#2-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EC%99%80-%ED%83%80%EC%9E%85-%EB%B3%84%EC%B9%AD\" aria-label=\"2 인터페이스와 타입 별칭 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. 인터페이스와 타입 별칭</h2>\n<h3 id=\"2-1-인터페이스\" style=\"position:relative;\"><a href=\"#2-1-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4\" aria-label=\"2 1 인터페이스 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2-1. 인터페이스</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// 기본 인터페이스</span>\n<span class=\"token keyword\">interface</span> <span class=\"token class-name\">User</span> <span class=\"token punctuation\">{</span>\n  id<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span>\n  name<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span>\n  email<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span>\n  age<span class=\"token operator\">?</span><span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 선택적 속성</span>\n  <span class=\"token keyword\">readonly</span> createdAt<span class=\"token operator\">:</span> Date<span class=\"token punctuation\">;</span> <span class=\"token comment\">// 읽기 전용</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 인터페이스 확장</span>\n<span class=\"token keyword\">interface</span> <span class=\"token class-name\">Admin</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">User</span> <span class=\"token punctuation\">{</span>\n  role<span class=\"token operator\">:</span> <span class=\"token string\">\"admin\"</span><span class=\"token punctuation\">;</span>\n  permissions<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 함수 타입 인터페이스</span>\n<span class=\"token keyword\">interface</span> <span class=\"token class-name\">Calculator</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token punctuation\">(</span>x<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">,</span> y<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> add<span class=\"token operator\">:</span> <span class=\"token function-variable function\">Calculator</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> x <span class=\"token operator\">+</span> y<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 인덱스 시그니처</span>\n<span class=\"token keyword\">interface</span> <span class=\"token class-name\">Dictionary</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token punctuation\">[</span>key<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">]</span><span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> scores<span class=\"token operator\">:</span> Dictionary <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  math<span class=\"token operator\">:</span> <span class=\"token number\">95</span><span class=\"token punctuation\">,</span>\n  science<span class=\"token operator\">:</span> <span class=\"token number\">88</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"2-2-타입-별칭\" style=\"position:relative;\"><a href=\"#2-2-%ED%83%80%EC%9E%85-%EB%B3%84%EC%B9%AD\" aria-label=\"2 2 타입 별칭 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2-2. 타입 별칭</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// 타입 별칭</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\"><span class=\"token constant\">ID</span></span> <span class=\"token operator\">=</span> <span class=\"token builtin\">string</span> <span class=\"token operator\">|</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">Status</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"pending\"</span> <span class=\"token operator\">|</span> <span class=\"token string\">\"approved\"</span> <span class=\"token operator\">|</span> <span class=\"token string\">\"rejected\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 함수 타입 별칭</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">EventHandler</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>event<span class=\"token operator\">:</span> Event<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">void</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 제네릭 타입 별칭</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">Container<span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token operator\">></span></span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  value<span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">;</span>\n  timestamp<span class=\"token operator\">:</span> Date<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 유니온과 인터섹션</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">StringOrNumber</span> <span class=\"token operator\">=</span> <span class=\"token builtin\">string</span> <span class=\"token operator\">|</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">PersonAndEmployee</span> <span class=\"token operator\">=</span> Person <span class=\"token operator\">&amp;</span> Employee<span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"2-3-인터페이스-vs-타입-별칭\" style=\"position:relative;\"><a href=\"#2-3-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-vs-%ED%83%80%EC%9E%85-%EB%B3%84%EC%B9%AD\" aria-label=\"2 3 인터페이스 vs 타입 별칭 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2-3. 인터페이스 vs 타입 별칭</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// 인터페이스는 확장 가능</span>\n<span class=\"token keyword\">interface</span> <span class=\"token class-name\">Base</span> <span class=\"token punctuation\">{</span>\n  id<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">interface</span> <span class=\"token class-name\">Extended</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Base</span> <span class=\"token punctuation\">{</span>\n  name<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 타입 별칭은 유니온/인터섹션에 유리</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">Status</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"active\"</span> <span class=\"token operator\">|</span> <span class=\"token string\">\"inactive\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\"><span class=\"token constant\">ID</span></span> <span class=\"token operator\">=</span> <span class=\"token builtin\">string</span> <span class=\"token operator\">|</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 인터페이스는 선언 병합 가능</span>\n<span class=\"token keyword\">interface</span> <span class=\"token class-name\">Config</span> <span class=\"token punctuation\">{</span>\n  apiUrl<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">interface</span> <span class=\"token class-name\">Config</span> <span class=\"token punctuation\">{</span>\n  timeout<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 최종 Config는 두 속성 모두 포함</span></code></pre></div>\n<h2 id=\"3-제네릭-generics\" style=\"position:relative;\"><a href=\"#3-%EC%A0%9C%EB%84%A4%EB%A6%AD-generics\" aria-label=\"3 제네릭 generics permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. 제네릭 (Generics)</h2>\n<h3 id=\"3-1-기본-제네릭\" style=\"position:relative;\"><a href=\"#3-1-%EA%B8%B0%EB%B3%B8-%EC%A0%9C%EB%84%A4%EB%A6%AD\" aria-label=\"3 1 기본 제네릭 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-1. 기본 제네릭</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// 제네릭 함수</span>\n<span class=\"token keyword\">function</span> <span class=\"token generic-function\"><span class=\"token function\">identity</span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token operator\">></span></span></span><span class=\"token punctuation\">(</span>arg<span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token constant\">T</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> arg<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> stringValue <span class=\"token operator\">=</span> <span class=\"token generic-function\"><span class=\"token function\">identity</span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;</span><span class=\"token builtin\">string</span><span class=\"token operator\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token string\">\"hello\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> numberValue <span class=\"token operator\">=</span> <span class=\"token generic-function\"><span class=\"token function\">identity</span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;</span><span class=\"token builtin\">number</span><span class=\"token operator\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token number\">42</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 제네릭 인터페이스</span>\n<span class=\"token keyword\">interface</span> <span class=\"token class-name\">Box<span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token operator\">></span></span> <span class=\"token punctuation\">{</span>\n  value<span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">getValue</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> stringBox<span class=\"token operator\">:</span> Box<span class=\"token operator\">&lt;</span><span class=\"token builtin\">string</span><span class=\"token operator\">></span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  value<span class=\"token operator\">:</span> <span class=\"token string\">\"hello\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token function\">getValue</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 제네릭 클래스</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Container<span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token operator\">></span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">private</span> items<span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>item<span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>items<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>item<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">get</span><span class=\"token punctuation\">(</span>index<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token constant\">T</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>items<span class=\"token punctuation\">[</span>index<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> numberContainer <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Container<span class=\"token operator\">&lt;</span><span class=\"token builtin\">number</span><span class=\"token operator\">></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nnumberContainer<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nnumberContainer<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"3-2-제네릭-제약-조건\" style=\"position:relative;\"><a href=\"#3-2-%EC%A0%9C%EB%84%A4%EB%A6%AD-%EC%A0%9C%EC%95%BD-%EC%A1%B0%EA%B1%B4\" aria-label=\"3 2 제네릭 제약 조건 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-2. 제네릭 제약 조건</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// extends로 제약</span>\n<span class=\"token keyword\">interface</span> <span class=\"token class-name\">HasLength</span> <span class=\"token punctuation\">{</span>\n  length<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token generic-function\"><span class=\"token function\">logLength</span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span> <span class=\"token keyword\">extends</span> HasLength<span class=\"token operator\">></span></span></span><span class=\"token punctuation\">(</span>arg<span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token constant\">T</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>arg<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> arg<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">logLength</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"hello\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// OK</span>\n<span class=\"token function\">logLength</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// OK</span>\n<span class=\"token comment\">// logLength(42); // Error: number는 length 속성이 없음</span>\n\n<span class=\"token comment\">// keyof 제약</span>\n<span class=\"token keyword\">function</span> <span class=\"token generic-function\"><span class=\"token function\">getProperty</span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">K</span> <span class=\"token keyword\">extends</span> <span class=\"token keyword\">keyof</span> <span class=\"token constant\">T</span><span class=\"token operator\">></span></span></span><span class=\"token punctuation\">(</span>obj<span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">,</span> key<span class=\"token operator\">:</span> <span class=\"token constant\">K</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">[</span><span class=\"token constant\">K</span><span class=\"token punctuation\">]</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> obj<span class=\"token punctuation\">[</span>key<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> person <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> name<span class=\"token operator\">:</span> <span class=\"token string\">\"Alice\"</span><span class=\"token punctuation\">,</span> age<span class=\"token operator\">:</span> <span class=\"token number\">30</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> name <span class=\"token operator\">=</span> <span class=\"token function\">getProperty</span><span class=\"token punctuation\">(</span>person<span class=\"token punctuation\">,</span> <span class=\"token string\">\"name\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// OK</span>\n<span class=\"token comment\">// const invalid = getProperty(person, \"invalid\"); // Error</span></code></pre></div>\n<h3 id=\"3-3-제네릭-유틸리티\" style=\"position:relative;\"><a href=\"#3-3-%EC%A0%9C%EB%84%A4%EB%A6%AD-%EC%9C%A0%ED%8B%B8%EB%A6%AC%ED%8B%B0\" aria-label=\"3 3 제네릭 유틸리티 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-3. 제네릭 유틸리티</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// 제네릭 함수 오버로드</span>\n<span class=\"token keyword\">function</span> <span class=\"token generic-function\"><span class=\"token function\">process</span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span> <span class=\"token keyword\">extends</span> <span class=\"token builtin\">string</span><span class=\"token operator\">></span></span></span><span class=\"token punctuation\">(</span>value<span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">function</span> <span class=\"token generic-function\"><span class=\"token function\">process</span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span> <span class=\"token keyword\">extends</span> <span class=\"token builtin\">number</span><span class=\"token operator\">></span></span></span><span class=\"token punctuation\">(</span>value<span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">function</span> <span class=\"token generic-function\"><span class=\"token function\">process</span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token operator\">></span></span></span><span class=\"token punctuation\">(</span>value<span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token constant\">T</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> value<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 조건부 제네릭</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">IsArray<span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token operator\">></span></span> <span class=\"token operator\">=</span> <span class=\"token constant\">T</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\"><span class=\"token builtin\">any</span></span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">?</span> <span class=\"token boolean\">true</span> <span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">Test1</span> <span class=\"token operator\">=</span> IsArray<span class=\"token operator\">&lt;</span><span class=\"token builtin\">string</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// true</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">Test2</span> <span class=\"token operator\">=</span> IsArray<span class=\"token operator\">&lt;</span><span class=\"token builtin\">string</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// false</span>\n\n<span class=\"token comment\">// 제네릭 기본값</span>\n<span class=\"token keyword\">interface</span> <span class=\"token class-name\">ApiResponse<span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span> <span class=\"token operator\">=</span> <span class=\"token builtin\">any</span><span class=\"token operator\">></span></span> <span class=\"token punctuation\">{</span>\n  data<span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">;</span>\n  status<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> response1<span class=\"token operator\">:</span> ApiResponse <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> data<span class=\"token operator\">:</span> <span class=\"token string\">\"hello\"</span><span class=\"token punctuation\">,</span> status<span class=\"token operator\">:</span> <span class=\"token number\">200</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> response2<span class=\"token operator\">:</span> ApiResponse<span class=\"token operator\">&lt;</span>User<span class=\"token operator\">></span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> data<span class=\"token operator\">:</span> user<span class=\"token punctuation\">,</span> status<span class=\"token operator\">:</span> <span class=\"token number\">200</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"4-고급-타입\" style=\"position:relative;\"><a href=\"#4-%EA%B3%A0%EA%B8%89-%ED%83%80%EC%9E%85\" aria-label=\"4 고급 타입 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4. 고급 타입</h2>\n<h3 id=\"4-1-조건부-타입-conditional-types\" style=\"position:relative;\"><a href=\"#4-1-%EC%A1%B0%EA%B1%B4%EB%B6%80-%ED%83%80%EC%9E%85-conditional-types\" aria-label=\"4 1 조건부 타입 conditional types permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4-1. 조건부 타입 (Conditional Types)</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// 기본 조건부 타입</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">IsString<span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token operator\">></span></span> <span class=\"token operator\">=</span> <span class=\"token constant\">T</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\"><span class=\"token builtin\">string</span></span> <span class=\"token operator\">?</span> <span class=\"token boolean\">true</span> <span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">Test1</span> <span class=\"token operator\">=</span> IsString<span class=\"token operator\">&lt;</span><span class=\"token builtin\">string</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// true</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">Test2</span> <span class=\"token operator\">=</span> IsString<span class=\"token operator\">&lt;</span><span class=\"token builtin\">number</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// false</span>\n\n<span class=\"token comment\">// 분배 조건부 타입</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">ToArray<span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token operator\">></span></span> <span class=\"token operator\">=</span> <span class=\"token constant\">T</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\"><span class=\"token builtin\">any</span></span> <span class=\"token operator\">?</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">:</span> <span class=\"token builtin\">never</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">StringArray</span> <span class=\"token operator\">=</span> ToArray<span class=\"token operator\">&lt;</span><span class=\"token builtin\">string</span> <span class=\"token operator\">|</span> <span class=\"token builtin\">number</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// string[] | number[]</span>\n\n<span class=\"token comment\">// Exclude와 Extract 구현</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">MyExclude<span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">U</span><span class=\"token operator\">></span></span> <span class=\"token operator\">=</span> <span class=\"token constant\">T</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\"><span class=\"token constant\">U</span></span> <span class=\"token operator\">?</span> <span class=\"token builtin\">never</span> <span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">MyExtract<span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">U</span><span class=\"token operator\">></span></span> <span class=\"token operator\">=</span> <span class=\"token constant\">T</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\"><span class=\"token constant\">U</span></span> <span class=\"token operator\">?</span> <span class=\"token constant\">T</span> <span class=\"token operator\">:</span> <span class=\"token builtin\">never</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">Result1</span> <span class=\"token operator\">=</span> MyExclude<span class=\"token operator\">&lt;</span><span class=\"token string\">\"a\"</span> <span class=\"token operator\">|</span> <span class=\"token string\">\"b\"</span> <span class=\"token operator\">|</span> <span class=\"token string\">\"c\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"a\"</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// \"b\" | \"c\"</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">Result2</span> <span class=\"token operator\">=</span> MyExtract<span class=\"token operator\">&lt;</span><span class=\"token string\">\"a\"</span> <span class=\"token operator\">|</span> <span class=\"token string\">\"b\"</span> <span class=\"token operator\">|</span> <span class=\"token string\">\"c\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"a\"</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// \"a\"</span>\n\n<span class=\"token comment\">// infer 키워드</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">ReturnType<span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token operator\">></span></span> <span class=\"token operator\">=</span> <span class=\"token constant\">T</span> <span class=\"token keyword\">extends</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">...</span>args<span class=\"token operator\">:</span> <span class=\"token builtin\">any</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">infer</span> <span class=\"token constant\">R</span> <span class=\"token operator\">?</span> <span class=\"token constant\">R</span> <span class=\"token operator\">:</span> <span class=\"token builtin\">any</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">FuncReturn</span> <span class=\"token operator\">=</span> ReturnType<span class=\"token operator\">&lt;</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token builtin\">string</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// string</span></code></pre></div>\n<h3 id=\"4-2-매핑된-타입-mapped-types\" style=\"position:relative;\"><a href=\"#4-2-%EB%A7%A4%ED%95%91%EB%90%9C-%ED%83%80%EC%9E%85-mapped-types\" aria-label=\"4 2 매핑된 타입 mapped types permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4-2. 매핑된 타입 (Mapped Types)</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// 기본 매핑된 타입</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">Readonly<span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token operator\">></span></span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">readonly</span> <span class=\"token punctuation\">[</span><span class=\"token constant\">P</span> <span class=\"token keyword\">in</span> <span class=\"token keyword\">keyof</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">]</span><span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">[</span><span class=\"token constant\">P</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">Partial<span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token operator\">></span></span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token punctuation\">[</span><span class=\"token constant\">P</span> <span class=\"token keyword\">in</span> <span class=\"token keyword\">keyof</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">]</span><span class=\"token operator\">?</span><span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">[</span><span class=\"token constant\">P</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">Required<span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token operator\">></span></span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token punctuation\">[</span><span class=\"token constant\">P</span> <span class=\"token keyword\">in</span> <span class=\"token keyword\">keyof</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">]</span><span class=\"token operator\">-</span><span class=\"token operator\">?</span><span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">[</span><span class=\"token constant\">P</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 사용 예시</span>\n<span class=\"token keyword\">interface</span> <span class=\"token class-name\">User</span> <span class=\"token punctuation\">{</span>\n  id<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span>\n  name<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span>\n  email<span class=\"token operator\">?</span><span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">ReadonlyUser</span> <span class=\"token operator\">=</span> Readonly<span class=\"token operator\">&lt;</span>User<span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">PartialUser</span> <span class=\"token operator\">=</span> Partial<span class=\"token operator\">&lt;</span>User<span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">RequiredUser</span> <span class=\"token operator\">=</span> Required<span class=\"token operator\">&lt;</span>User<span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 커스텀 매핑된 타입</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">Nullable<span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token operator\">></span></span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token punctuation\">[</span><span class=\"token constant\">P</span> <span class=\"token keyword\">in</span> <span class=\"token keyword\">keyof</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">]</span><span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">[</span><span class=\"token constant\">P</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">|</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">Stringify<span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token operator\">></span></span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token punctuation\">[</span><span class=\"token constant\">P</span> <span class=\"token keyword\">in</span> <span class=\"token keyword\">keyof</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">]</span><span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"4-3-템플릿-리터럴-타입\" style=\"position:relative;\"><a href=\"#4-3-%ED%85%9C%ED%94%8C%EB%A6%BF-%EB%A6%AC%ED%84%B0%EB%9F%B4-%ED%83%80%EC%9E%85\" aria-label=\"4 3 템플릿 리터럴 타입 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4-3. 템플릿 리터럴 타입</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// 기본 템플릿 리터럴 타입</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">EventName</span> <span class=\"token operator\">=</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">on</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token builtin\">string</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">ClickEvent</span> <span class=\"token operator\">=</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">onClick</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">HoverEvent</span> <span class=\"token operator\">=</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">onHover</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 고급 템플릿 리터럴 타입</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">HttpMethod</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"GET\"</span> <span class=\"token operator\">|</span> <span class=\"token string\">\"POST\"</span> <span class=\"token operator\">|</span> <span class=\"token string\">\"PUT\"</span> <span class=\"token operator\">|</span> <span class=\"token string\">\"DELETE\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">ApiEndpoint</span> <span class=\"token operator\">=</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">/api/</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token builtin\">string</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">FullEndpoint</span> <span class=\"token operator\">=</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>HttpMethod<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>ApiEndpoint<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">GetUsers</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"GET /api/users\"</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// OK</span>\n<span class=\"token comment\">// type Invalid = \"PATCH /api/users\"; // Error</span>\n\n<span class=\"token comment\">// 유니온과 조합</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">Color</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"red\"</span> <span class=\"token operator\">|</span> <span class=\"token string\">\"green\"</span> <span class=\"token operator\">|</span> <span class=\"token string\">\"blue\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">Size</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"small\"</span> <span class=\"token operator\">|</span> <span class=\"token string\">\"medium\"</span> <span class=\"token operator\">|</span> <span class=\"token string\">\"large\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">ButtonClass</span> <span class=\"token operator\">=</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">btn-</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>Color<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">-</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>Size<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\">// \"btn-red-small\" | \"btn-red-medium\" | \"btn-red-large\" | ...</span></code></pre></div>\n<h2 id=\"5-유틸리티-타입\" style=\"position:relative;\"><a href=\"#5-%EC%9C%A0%ED%8B%B8%EB%A6%AC%ED%8B%B0-%ED%83%80%EC%9E%85\" aria-label=\"5 유틸리티 타입 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5. 유틸리티 타입</h2>\n<h3 id=\"5-1-기본-유틸리티-타입\" style=\"position:relative;\"><a href=\"#5-1-%EA%B8%B0%EB%B3%B8-%EC%9C%A0%ED%8B%B8%EB%A6%AC%ED%8B%B0-%ED%83%80%EC%9E%85\" aria-label=\"5 1 기본 유틸리티 타입 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5-1. 기본 유틸리티 타입</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token keyword\">interface</span> <span class=\"token class-name\">User</span> <span class=\"token punctuation\">{</span>\n  id<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span>\n  name<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span>\n  email<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span>\n  age<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span>\n  createdAt<span class=\"token operator\">:</span> Date<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Pick: 특정 속성만 선택</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">UserPreview</span> <span class=\"token operator\">=</span> Pick<span class=\"token operator\">&lt;</span>User<span class=\"token punctuation\">,</span> <span class=\"token string\">\"id\"</span> <span class=\"token operator\">|</span> <span class=\"token string\">\"name\"</span> <span class=\"token operator\">|</span> <span class=\"token string\">\"email\"</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Omit: 특정 속성 제외</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">UserWithoutDates</span> <span class=\"token operator\">=</span> Omit<span class=\"token operator\">&lt;</span>User<span class=\"token punctuation\">,</span> <span class=\"token string\">\"createdAt\"</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Partial: 모든 속성을 선택적으로</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">PartialUser</span> <span class=\"token operator\">=</span> Partial<span class=\"token operator\">&lt;</span>User<span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Required: 모든 속성을 필수로</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">RequiredUser</span> <span class=\"token operator\">=</span> Required<span class=\"token operator\">&lt;</span>PartialUser<span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Readonly: 모든 속성을 읽기 전용으로</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">ReadonlyUser</span> <span class=\"token operator\">=</span> Readonly<span class=\"token operator\">&lt;</span>User<span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Record: 키-값 타입 매핑</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">UserRoles</span> <span class=\"token operator\">=</span> Record<span class=\"token operator\">&lt;</span><span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"admin\"</span> <span class=\"token operator\">|</span> <span class=\"token string\">\"user\"</span> <span class=\"token operator\">|</span> <span class=\"token string\">\"guest\"</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"5-2-고급-유틸리티-타입\" style=\"position:relative;\"><a href=\"#5-2-%EA%B3%A0%EA%B8%89-%EC%9C%A0%ED%8B%B8%EB%A6%AC%ED%8B%B0-%ED%83%80%EC%9E%85\" aria-label=\"5 2 고급 유틸리티 타입 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5-2. 고급 유틸리티 타입</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// Exclude: 유니온에서 특정 타입 제외</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">NonNullable<span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token operator\">></span></span> <span class=\"token operator\">=</span> <span class=\"token constant\">T</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\"><span class=\"token keyword\">null</span></span> <span class=\"token operator\">|</span> <span class=\"token keyword\">undefined</span> <span class=\"token operator\">?</span> <span class=\"token builtin\">never</span> <span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">StringOrNumber</span> <span class=\"token operator\">=</span> <span class=\"token builtin\">string</span> <span class=\"token operator\">|</span> <span class=\"token builtin\">number</span> <span class=\"token operator\">|</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">ValidValue</span> <span class=\"token operator\">=</span> NonNullable<span class=\"token operator\">&lt;</span>StringOrNumber<span class=\"token operator\">></span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// string | number</span>\n\n<span class=\"token comment\">// Extract: 유니온에서 특정 타입만 추출</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">StringOnly</span> <span class=\"token operator\">=</span> Extract<span class=\"token operator\">&lt;</span><span class=\"token builtin\">string</span> <span class=\"token operator\">|</span> <span class=\"token builtin\">number</span> <span class=\"token operator\">|</span> <span class=\"token builtin\">boolean</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">string</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// string</span>\n\n<span class=\"token comment\">// Parameters: 함수의 매개변수 타입 추출</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">FuncParams</span> <span class=\"token operator\">=</span> Parameters<span class=\"token operator\">&lt;</span><span class=\"token punctuation\">(</span>a<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">,</span> b<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">void</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// [number, string]</span>\n\n<span class=\"token comment\">// ReturnType: 함수의 반환 타입 추출</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">FuncReturn</span> <span class=\"token operator\">=</span> ReturnType<span class=\"token operator\">&lt;</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token builtin\">string</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// string</span>\n\n<span class=\"token comment\">// ConstructorParameters: 생성자의 매개변수 타입</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">User</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">public</span> id<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">public</span> name<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">UserParams</span> <span class=\"token operator\">=</span> ConstructorParameters<span class=\"token operator\">&lt;</span><span class=\"token keyword\">typeof</span> User<span class=\"token operator\">></span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// [number, string]</span>\n\n<span class=\"token comment\">// InstanceType: 인스턴스 타입</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">UserInstance</span> <span class=\"token operator\">=</span> InstanceType<span class=\"token operator\">&lt;</span><span class=\"token keyword\">typeof</span> User<span class=\"token operator\">></span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// User</span></code></pre></div>\n<h3 id=\"5-3-커스텀-유틸리티-타입\" style=\"position:relative;\"><a href=\"#5-3-%EC%BB%A4%EC%8A%A4%ED%85%80-%EC%9C%A0%ED%8B%B8%EB%A6%AC%ED%8B%B0-%ED%83%80%EC%9E%85\" aria-label=\"5 3 커스텀 유틸리티 타입 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5-3. 커스텀 유틸리티 타입</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// 깊은 읽기 전용</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">DeepReadonly<span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token operator\">></span></span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">readonly</span> <span class=\"token punctuation\">[</span><span class=\"token constant\">P</span> <span class=\"token keyword\">in</span> <span class=\"token keyword\">keyof</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">]</span><span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">[</span><span class=\"token constant\">P</span><span class=\"token punctuation\">]</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">object</span> <span class=\"token operator\">?</span> DeepReadonly<span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token punctuation\">[</span><span class=\"token constant\">P</span><span class=\"token punctuation\">]</span><span class=\"token operator\">></span> <span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">[</span><span class=\"token constant\">P</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 깊은 Partial</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">DeepPartial<span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token operator\">></span></span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token punctuation\">[</span><span class=\"token constant\">P</span> <span class=\"token keyword\">in</span> <span class=\"token keyword\">keyof</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">]</span><span class=\"token operator\">?</span><span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">[</span><span class=\"token constant\">P</span><span class=\"token punctuation\">]</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">object</span> <span class=\"token operator\">?</span> DeepPartial<span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token punctuation\">[</span><span class=\"token constant\">P</span><span class=\"token punctuation\">]</span><span class=\"token operator\">></span> <span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">[</span><span class=\"token constant\">P</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 함수 타입에서 특정 매개변수 제거</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">OmitFirstArg<span class=\"token operator\">&lt;</span><span class=\"token constant\">F</span><span class=\"token operator\">></span></span> <span class=\"token operator\">=</span> <span class=\"token constant\">F</span> <span class=\"token keyword\">extends</span> <span class=\"token punctuation\">(</span>first<span class=\"token operator\">:</span> <span class=\"token builtin\">any</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>rest<span class=\"token operator\">:</span> <span class=\"token keyword\">infer</span> <span class=\"token constant\">R</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">infer</span> Return\n  <span class=\"token operator\">?</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">...</span>args<span class=\"token operator\">:</span> <span class=\"token constant\">R</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> Return\n  <span class=\"token operator\">:</span> <span class=\"token builtin\">never</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">Original</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>a<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">,</span> b<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> c<span class=\"token operator\">:</span> <span class=\"token builtin\">boolean</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">void</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">WithoutFirst</span> <span class=\"token operator\">=</span> OmitFirstArg<span class=\"token operator\">&lt;</span>Original<span class=\"token operator\">></span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// (b: string, c: boolean) => void</span></code></pre></div>\n<h2 id=\"6-타입-가드와-타입-단언\" style=\"position:relative;\"><a href=\"#6-%ED%83%80%EC%9E%85-%EA%B0%80%EB%93%9C%EC%99%80-%ED%83%80%EC%9E%85-%EB%8B%A8%EC%96%B8\" aria-label=\"6 타입 가드와 타입 단언 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6. 타입 가드와 타입 단언</h2>\n<h3 id=\"6-1-타입-가드\" style=\"position:relative;\"><a href=\"#6-1-%ED%83%80%EC%9E%85-%EA%B0%80%EB%93%9C\" aria-label=\"6 1 타입 가드 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6-1. 타입 가드</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// typeof 타입 가드</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">isString</span><span class=\"token punctuation\">(</span>value<span class=\"token operator\">:</span> <span class=\"token builtin\">unknown</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> value <span class=\"token keyword\">is</span> <span class=\"token builtin\">string</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">typeof</span> value <span class=\"token operator\">===</span> <span class=\"token string\">\"string\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">process</span><span class=\"token punctuation\">(</span>value<span class=\"token operator\">:</span> <span class=\"token builtin\">unknown</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isString</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// 여기서 value는 string 타입</span>\n    <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">.</span><span class=\"token function\">toUpperCase</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// instanceof 타입 가드</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Dog</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">bark</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Woof!\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Cat</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">meow</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Meow!\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">makeSound</span><span class=\"token punctuation\">(</span>animal<span class=\"token operator\">:</span> Dog <span class=\"token operator\">|</span> Cat<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>animal <span class=\"token keyword\">instanceof</span> <span class=\"token class-name\">Dog</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    animal<span class=\"token punctuation\">.</span><span class=\"token function\">bark</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    animal<span class=\"token punctuation\">.</span><span class=\"token function\">meow</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// in 연산자 타입 가드</span>\n<span class=\"token keyword\">interface</span> <span class=\"token class-name\">Bird</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">fly</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">interface</span> <span class=\"token class-name\">Fish</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">swim</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">move</span><span class=\"token punctuation\">(</span>animal<span class=\"token operator\">:</span> Bird <span class=\"token operator\">|</span> Fish<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token string\">\"fly\"</span> <span class=\"token keyword\">in</span> animal<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    animal<span class=\"token punctuation\">.</span><span class=\"token function\">fly</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    animal<span class=\"token punctuation\">.</span><span class=\"token function\">swim</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"6-2-커스텀-타입-가드\" style=\"position:relative;\"><a href=\"#6-2-%EC%BB%A4%EC%8A%A4%ED%85%80-%ED%83%80%EC%9E%85-%EA%B0%80%EB%93%9C\" aria-label=\"6 2 커스텀 타입 가드 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6-2. 커스텀 타입 가드</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token keyword\">interface</span> <span class=\"token class-name\">User</span> <span class=\"token punctuation\">{</span>\n  id<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span>\n  name<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span>\n  email<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">interface</span> <span class=\"token class-name\">Admin</span> <span class=\"token punctuation\">{</span>\n  id<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span>\n  name<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span>\n  role<span class=\"token operator\">:</span> <span class=\"token string\">\"admin\"</span><span class=\"token punctuation\">;</span>\n  permissions<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">isAdmin</span><span class=\"token punctuation\">(</span>user<span class=\"token operator\">:</span> User <span class=\"token operator\">|</span> Admin<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> user <span class=\"token keyword\">is</span> Admin <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token string\">\"role\"</span> <span class=\"token keyword\">in</span> user <span class=\"token operator\">&amp;&amp;</span> user<span class=\"token punctuation\">.</span>role <span class=\"token operator\">===</span> <span class=\"token string\">\"admin\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">processUser</span><span class=\"token punctuation\">(</span>user<span class=\"token operator\">:</span> User <span class=\"token operator\">|</span> Admin<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isAdmin</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// 여기서 user는 Admin 타입</span>\n    <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">.</span>permissions<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// 여기서 user는 User 타입</span>\n    <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">.</span>email<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"6-3-타입-단언\" style=\"position:relative;\"><a href=\"#6-3-%ED%83%80%EC%9E%85-%EB%8B%A8%EC%96%B8\" aria-label=\"6 3 타입 단언 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6-3. 타입 단언</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// as 단언</span>\n<span class=\"token keyword\">const</span> value <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">getElementById</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"myInput\"</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> HTMLInputElement<span class=\"token punctuation\">;</span>\nvalue<span class=\"token punctuation\">.</span>value <span class=\"token operator\">=</span> <span class=\"token string\">\"hello\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// angle bracket 단언 (JSX에서는 사용 불가)</span>\n<span class=\"token keyword\">const</span> element <span class=\"token operator\">=</span> <span class=\"token operator\">&lt;</span>HTMLInputElement<span class=\"token operator\">></span>document<span class=\"token punctuation\">.</span><span class=\"token function\">getElementById</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"myInput\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// non-null 단언</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">getElement</span><span class=\"token punctuation\">(</span>id<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">getElementById</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span><span class=\"token operator\">!</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// null이 아님을 단언</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 타입 단언 vs 타입 가드</span>\n<span class=\"token comment\">// 타입 단언: 개발자가 보장 (런타임 체크 없음)</span>\n<span class=\"token keyword\">const</span> user <span class=\"token operator\">=</span> data <span class=\"token keyword\">as</span> User<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 타입 가드: 런타임 체크</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isUser</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// data는 User 타입</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"7-모듈-시스템\" style=\"position:relative;\"><a href=\"#7-%EB%AA%A8%EB%93%88-%EC%8B%9C%EC%8A%A4%ED%85%9C\" aria-label=\"7 모듈 시스템 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7. 모듈 시스템</h2>\n<h3 id=\"7-1-es-모듈\" style=\"position:relative;\"><a href=\"#7-1-es-%EB%AA%A8%EB%93%88\" aria-label=\"7 1 es 모듈 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7-1. ES 모듈</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// math.ts</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>a<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">,</span> b<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">number</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> a <span class=\"token operator\">+</span> b<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">subtract</span><span class=\"token punctuation\">(</span>a<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">,</span> b<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">number</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> a <span class=\"token operator\">-</span> b<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> <span class=\"token constant\">PI</span> <span class=\"token operator\">=</span> <span class=\"token number\">3.14159</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// default export</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Calculator</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>a<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">,</span> b<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">number</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> a <span class=\"token operator\">+</span> b<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// app.ts</span>\n<span class=\"token keyword\">import</span> Calculator<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> add<span class=\"token punctuation\">,</span> subtract<span class=\"token punctuation\">,</span> <span class=\"token constant\">PI</span> <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"./math\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token operator\">*</span> <span class=\"token keyword\">as</span> MathUtils <span class=\"token keyword\">from</span> <span class=\"token string\">\"./math\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> calc <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Calculator</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> sum <span class=\"token operator\">=</span> <span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> diff <span class=\"token operator\">=</span> <span class=\"token function\">subtract</span><span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> area <span class=\"token operator\">=</span> <span class=\"token constant\">PI</span> <span class=\"token operator\">*</span> <span class=\"token number\">10</span> <span class=\"token operator\">*</span> <span class=\"token number\">10</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"7-2-네임스페이스\" style=\"position:relative;\"><a href=\"#7-2-%EB%84%A4%EC%9E%84%EC%8A%A4%ED%8E%98%EC%9D%B4%EC%8A%A4\" aria-label=\"7 2 네임스페이스 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7-2. 네임스페이스</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// utils.ts</span>\n<span class=\"token keyword\">namespace</span> MathUtils <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>a<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">,</span> b<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">number</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> a <span class=\"token operator\">+</span> b<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">subtract</span><span class=\"token punctuation\">(</span>a<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">,</span> b<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">number</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> a <span class=\"token operator\">-</span> b<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">export</span> <span class=\"token keyword\">namespace</span> Geometry <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">area</span><span class=\"token punctuation\">(</span>radius<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">number</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> Math<span class=\"token punctuation\">.</span><span class=\"token constant\">PI</span> <span class=\"token operator\">*</span> radius <span class=\"token operator\">*</span> radius<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 사용</span>\nMathUtils<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nMathUtils<span class=\"token punctuation\">.</span>Geometry<span class=\"token punctuation\">.</span><span class=\"token function\">area</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"7-3-타입-선언-파일-dts\" style=\"position:relative;\"><a href=\"#7-3-%ED%83%80%EC%9E%85-%EC%84%A0%EC%96%B8-%ED%8C%8C%EC%9D%BC-dts\" aria-label=\"7 3 타입 선언 파일 dts permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7-3. 타입 선언 파일 (.d.ts)</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// types.d.ts</span>\n<span class=\"token keyword\">declare</span> <span class=\"token keyword\">module</span> <span class=\"token string\">\"my-module\"</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">export</span> <span class=\"token keyword\">function</span> <span class=\"token function\">doSomething</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> value<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 전역 타입 선언</span>\n<span class=\"token keyword\">declare</span> global <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">interface</span> <span class=\"token class-name\">Window</span> <span class=\"token punctuation\">{</span>\n    myCustomProperty<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 외부 라이브러리 타입 확장</span>\n<span class=\"token keyword\">declare</span> <span class=\"token keyword\">module</span> <span class=\"token string\">\"express\"</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">interface</span> <span class=\"token class-name\">Request</span> <span class=\"token punctuation\">{</span>\n    user<span class=\"token operator\">?</span><span class=\"token operator\">:</span> User<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"8-데코레이터-decorators\" style=\"position:relative;\"><a href=\"#8-%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0-decorators\" aria-label=\"8 데코레이터 decorators permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>8. 데코레이터 (Decorators)</h2>\n<h3 id=\"8-1-클래스-데코레이터\" style=\"position:relative;\"><a href=\"#8-1-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0\" aria-label=\"8 1 클래스 데코레이터 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>8-1. 클래스 데코레이터</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token keyword\">function</span> <span class=\"token function\">sealed</span><span class=\"token punctuation\">(</span>constructor<span class=\"token operator\">:</span> <span class=\"token builtin\">Function</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  Object<span class=\"token punctuation\">.</span><span class=\"token function\">seal</span><span class=\"token punctuation\">(</span>constructor<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  Object<span class=\"token punctuation\">.</span><span class=\"token function\">seal</span><span class=\"token punctuation\">(</span>constructor<span class=\"token punctuation\">.</span>prototype<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token decorator\"><span class=\"token at operator\">@</span><span class=\"token function\">sealed</span></span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Greeter</span> <span class=\"token punctuation\">{</span>\n  greeting<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span>message<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>greeting <span class=\"token operator\">=</span> message<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token function\">greet</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token string\">\"Hello, \"</span> <span class=\"token operator\">+</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>greeting<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 메서드 데코레이터</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">log</span><span class=\"token punctuation\">(</span>target<span class=\"token operator\">:</span> <span class=\"token builtin\">any</span><span class=\"token punctuation\">,</span> propertyKey<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> descriptor<span class=\"token operator\">:</span> PropertyDescriptor<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> originalMethod <span class=\"token operator\">=</span> descriptor<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">;</span>\n\n  descriptor<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">value</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">...</span>args<span class=\"token operator\">:</span> <span class=\"token builtin\">any</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Calling </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>propertyKey<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> with</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span> args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> result <span class=\"token operator\">=</span> <span class=\"token function\">originalMethod</span><span class=\"token punctuation\">.</span><span class=\"token function\">apply</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">,</span> args<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>propertyKey<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> returned</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span> result<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> result<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> descriptor<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Calculator</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token decorator\"><span class=\"token at operator\">@</span><span class=\"token function\">log</span></span>\n  <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>a<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">,</span> b<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">number</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> a <span class=\"token operator\">+</span> b<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"8-2-속성-데코레이터\" style=\"position:relative;\"><a href=\"#8-2-%EC%86%8D%EC%84%B1-%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0\" aria-label=\"8 2 속성 데코레이터 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>8-2. 속성 데코레이터</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token keyword\">function</span> <span class=\"token keyword\">readonly</span><span class=\"token punctuation\">(</span>target<span class=\"token operator\">:</span> <span class=\"token builtin\">any</span><span class=\"token punctuation\">,</span> propertyKey<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  Object<span class=\"token punctuation\">.</span><span class=\"token function\">defineProperty</span><span class=\"token punctuation\">(</span>target<span class=\"token punctuation\">,</span> propertyKey<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n    writable<span class=\"token operator\">:</span> <span class=\"token boolean\">false</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">User</span> <span class=\"token punctuation\">{</span>\n  @<span class=\"token keyword\">readonly</span>\n  id<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span> <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n  name<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"Alice\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 매개변수 데코레이터</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">validate</span><span class=\"token punctuation\">(</span>target<span class=\"token operator\">:</span> <span class=\"token builtin\">any</span><span class=\"token punctuation\">,</span> propertyKey<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> parameterIndex<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// 검증 로직</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">ApiService</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">getUser</span><span class=\"token punctuation\">(</span><span class=\"token decorator\"><span class=\"token at operator\">@</span><span class=\"token function\">validate</span></span> id<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// ...</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"9-실전-패턴\" style=\"position:relative;\"><a href=\"#9-%EC%8B%A4%EC%A0%84-%ED%8C%A8%ED%84%B4\" aria-label=\"9 실전 패턴 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>9. 실전 패턴</h2>\n<h3 id=\"9-1-빌더-패턴\" style=\"position:relative;\"><a href=\"#9-1-%EB%B9%8C%EB%8D%94-%ED%8C%A8%ED%84%B4\" aria-label=\"9 1 빌더 패턴 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>9-1. 빌더 패턴</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">QueryBuilder<span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token operator\">></span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">private</span> conditions<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">private</span> limitValue<span class=\"token operator\">?</span><span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">private</span> offsetValue<span class=\"token operator\">?</span><span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">where</span><span class=\"token punctuation\">(</span>condition<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">this</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>conditions<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>condition<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">limit</span><span class=\"token punctuation\">(</span>count<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">this</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>limitValue <span class=\"token operator\">=</span> count<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">offset</span><span class=\"token punctuation\">(</span>count<span class=\"token operator\">:</span> <span class=\"token builtin\">number</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">this</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>offsetValue <span class=\"token operator\">=</span> count<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">string</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> query <span class=\"token operator\">=</span> <span class=\"token string\">\"SELECT * FROM table\"</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>conditions<span class=\"token punctuation\">.</span>length <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      query <span class=\"token operator\">+=</span> <span class=\"token string\">\" WHERE \"</span> <span class=\"token operator\">+</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>conditions<span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">\" AND \"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>limitValue<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      query <span class=\"token operator\">+=</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\"> LIMIT </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>limitValue<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>offsetValue<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      query <span class=\"token operator\">+=</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\"> OFFSET </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>offsetValue<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> query<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> query <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">QueryBuilder</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">where</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"age > 18\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">where</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"status = 'active'\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">limit</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">offset</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"9-2-팩토리-패턴\" style=\"position:relative;\"><a href=\"#9-2-%ED%8C%A9%ED%86%A0%EB%A6%AC-%ED%8C%A8%ED%84%B4\" aria-label=\"9 2 팩토리 패턴 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>9-2. 팩토리 패턴</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token keyword\">interface</span> <span class=\"token class-name\">Animal</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">makeSound</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Dog</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">Animal</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">makeSound</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Woof!\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Cat</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">Animal</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">makeSound</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Meow!\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">type</span> <span class=\"token class-name\">AnimalType</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"dog\"</span> <span class=\"token operator\">|</span> <span class=\"token string\">\"cat\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">AnimalFactory</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">static</span> <span class=\"token function\">create</span><span class=\"token punctuation\">(</span>type<span class=\"token operator\">:</span> AnimalType<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> Animal <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">switch</span> <span class=\"token punctuation\">(</span>type<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">case</span> <span class=\"token string\">\"dog\"</span><span class=\"token operator\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Dog</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">case</span> <span class=\"token string\">\"cat\"</span><span class=\"token operator\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Cat</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">default</span><span class=\"token operator\">:</span>\n        <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Error</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">Unknown animal type: </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token keyword\">type</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> dog <span class=\"token operator\">=</span> AnimalFactory<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"dog\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\ndog<span class=\"token punctuation\">.</span><span class=\"token function\">makeSound</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"9-3-싱글톤-패턴\" style=\"position:relative;\"><a href=\"#9-3-%EC%8B%B1%EA%B8%80%ED%86%A4-%ED%8C%A8%ED%84%B4\" aria-label=\"9 3 싱글톤 패턴 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>9-3. 싱글톤 패턴</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Database</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">private</span> <span class=\"token keyword\">static</span> instance<span class=\"token operator\">:</span> Database<span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">private</span> <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// private 생성자로 외부 인스턴스화 방지</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">static</span> <span class=\"token function\">getInstance</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> Database <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>Database<span class=\"token punctuation\">.</span>instance<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      Database<span class=\"token punctuation\">.</span>instance <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Database</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> Database<span class=\"token punctuation\">.</span>instance<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">query</span><span class=\"token punctuation\">(</span>sql<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">any</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// 데이터베이스 쿼리 로직</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> db1 <span class=\"token operator\">=</span> Database<span class=\"token punctuation\">.</span><span class=\"token function\">getInstance</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> db2 <span class=\"token operator\">=</span> Database<span class=\"token punctuation\">.</span><span class=\"token function\">getInstance</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>db1 <span class=\"token operator\">===</span> db2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// true</span></code></pre></div>\n<h2 id=\"10-타입-안전성-모범-사례\" style=\"position:relative;\"><a href=\"#10-%ED%83%80%EC%9E%85-%EC%95%88%EC%A0%84%EC%84%B1-%EB%AA%A8%EB%B2%94-%EC%82%AC%EB%A1%80\" aria-label=\"10 타입 안전성 모범 사례 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>10. 타입 안전성 모범 사례</h2>\n<h3 id=\"10-1-엄격한-타입-사용\" style=\"position:relative;\"><a href=\"#10-1-%EC%97%84%EA%B2%A9%ED%95%9C-%ED%83%80%EC%9E%85-%EC%82%AC%EC%9A%A9\" aria-label=\"10 1 엄격한 타입 사용 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>10-1. 엄격한 타입 사용</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// ❌ 나쁜 예: any 사용</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">processData</span><span class=\"token punctuation\">(</span>data<span class=\"token operator\">:</span> <span class=\"token builtin\">any</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> data<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// ✅ 좋은 예: 구체적인 타입 사용</span>\n<span class=\"token keyword\">interface</span> <span class=\"token class-name\">Data</span> <span class=\"token punctuation\">{</span>\n  value<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span>\n  timestamp<span class=\"token operator\">:</span> Date<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">processData</span><span class=\"token punctuation\">(</span>data<span class=\"token operator\">:</span> Data<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">string</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> data<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"10-2-타입-가드-활용\" style=\"position:relative;\"><a href=\"#10-2-%ED%83%80%EC%9E%85-%EA%B0%80%EB%93%9C-%ED%99%9C%EC%9A%A9\" aria-label=\"10 2 타입 가드 활용 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>10-2. 타입 가드 활용</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// ❌ 나쁜 예: 타입 단언 남용</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">getValue</span><span class=\"token punctuation\">(</span>data<span class=\"token operator\">:</span> <span class=\"token builtin\">unknown</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">string</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>data <span class=\"token keyword\">as</span> <span class=\"token punctuation\">{</span> value<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// ✅ 좋은 예: 타입 가드 사용</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">isDataWithValue</span><span class=\"token punctuation\">(</span>data<span class=\"token operator\">:</span> <span class=\"token builtin\">unknown</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> data <span class=\"token keyword\">is</span> <span class=\"token punctuation\">{</span> value<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">typeof</span> data <span class=\"token operator\">===</span> <span class=\"token string\">\"object\"</span> <span class=\"token operator\">&amp;&amp;</span>\n    data <span class=\"token operator\">!==</span> <span class=\"token keyword\">null</span> <span class=\"token operator\">&amp;&amp;</span>\n    <span class=\"token string\">\"value\"</span> <span class=\"token keyword\">in</span> data <span class=\"token operator\">&amp;&amp;</span>\n    <span class=\"token keyword\">typeof</span> <span class=\"token punctuation\">(</span>data <span class=\"token keyword\">as</span> <span class=\"token builtin\">any</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>value <span class=\"token operator\">===</span> <span class=\"token string\">\"string\"</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">getValue</span><span class=\"token punctuation\">(</span>data<span class=\"token operator\">:</span> <span class=\"token builtin\">unknown</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">string</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isDataWithValue</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> data<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Invalid data\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"10-3-제네릭-활용\" style=\"position:relative;\"><a href=\"#10-3-%EC%A0%9C%EB%84%A4%EB%A6%AD-%ED%99%9C%EC%9A%A9\" aria-label=\"10 3 제네릭 활용 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>10-3. 제네릭 활용</h3>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// ❌ 나쁜 예: 타입이 구체적이지 않음</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">getFirst</span><span class=\"token punctuation\">(</span>arr<span class=\"token operator\">:</span> <span class=\"token builtin\">any</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">any</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> arr<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// ✅ 좋은 예: 제네릭 사용</span>\n<span class=\"token keyword\">function</span> <span class=\"token generic-function\"><span class=\"token function\">getFirst</span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token operator\">></span></span></span><span class=\"token punctuation\">(</span>arr<span class=\"token operator\">:</span> <span class=\"token constant\">T</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token constant\">T</span> <span class=\"token operator\">|</span> <span class=\"token keyword\">undefined</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> arr<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> firstNumber <span class=\"token operator\">=</span> <span class=\"token function\">getFirst</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// number | undefined</span>\n<span class=\"token keyword\">const</span> firstString <span class=\"token operator\">=</span> <span class=\"token function\">getFirst</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"a\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"b\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"c\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// string | undefined</span></code></pre></div>\n<h2 id=\"11-결론\" style=\"position:relative;\"><a href=\"#11-%EA%B2%B0%EB%A1%A0\" aria-label=\"11 결론 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>11. 결론</h2>\n<p>TypeScript는 JavaScript 개발을 더 안전하고 유지보수하기 쉽게 만들어주는 강력한 도구다. 이 글에서 다룬 내용:</p>\n<ol>\n<li><strong>기본 타입 시스템</strong>: 원시 타입, 배열, 튜플, 열거형</li>\n<li><strong>인터페이스와 타입 별칭</strong>: 객체 구조 정의</li>\n<li><strong>제네릭</strong>: 재사용 가능한 타입 코드</li>\n<li><strong>고급 타입</strong>: 조건부 타입, 매핑된 타입, 템플릿 리터럴 타입</li>\n<li><strong>유틸리티 타입</strong>: Pick, Omit, Partial 등</li>\n<li><strong>타입 가드</strong>: 런타임 타입 검증</li>\n<li><strong>모듈 시스템</strong>: ES 모듈, 네임스페이스</li>\n<li><strong>데코레이터</strong>: 메타프로그래밍</li>\n<li><strong>실전 패턴</strong>: 빌더, 팩토리, 싱글톤</li>\n</ol>\n<p>이러한 기능들을 적절히 활용하면 타입 안전하고 확장 가능한 애플리케이션을 구축할 수 있다.</p>\n<h2 id=\"참고-자료\" style=\"position:relative;\"><a href=\"#%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C\" aria-label=\"참고 자료 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>참고 자료</h2>\n<ul>\n<li><a href=\"https://www.typescriptlang.org/docs/\">TypeScript 공식 문서</a></li>\n<li><a href=\"https://basarat.gitbook.io/typescript/\">TypeScript Deep Dive</a></li>\n<li><a href=\"https://www.typescriptlang.org/docs/handbook/intro.html\">TypeScript Handbook</a></li>\n</ul>","tableOfContents":"<ul>\n<li>\n<p><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#typescript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5---%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80\">TypeScript 완전정복 - 타입 시스템부터 고급 패턴까지</a></p>\n<ul>\n<li>\n<p><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#1-typescript-%EA%B8%B0%EB%B3%B8-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C\">1. TypeScript 기본 타입 시스템</a></p>\n<ul>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#1-1-%EA%B8%B0%EB%B3%B8-%ED%83%80%EC%9E%85\">1-1. 기본 타입</a></li>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#1-2-%ED%83%80%EC%9E%85-%EC%B6%94%EB%A1%A0\">1-2. 타입 추론</a></li>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#1-3-%EC%9C%A0%EB%8B%88%EC%98%A8%EA%B3%BC-%EC%9D%B8%ED%84%B0%EC%84%B9%EC%85%98-%ED%83%80%EC%9E%85\">1-3. 유니온과 인터섹션 타입</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#2-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EC%99%80-%ED%83%80%EC%9E%85-%EB%B3%84%EC%B9%AD\">2. 인터페이스와 타입 별칭</a></p>\n<ul>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#2-1-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4\">2-1. 인터페이스</a></li>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#2-2-%ED%83%80%EC%9E%85-%EB%B3%84%EC%B9%AD\">2-2. 타입 별칭</a></li>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#2-3-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-vs-%ED%83%80%EC%9E%85-%EB%B3%84%EC%B9%AD\">2-3. 인터페이스 vs 타입 별칭</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#3-%EC%A0%9C%EB%84%A4%EB%A6%AD-generics\">3. 제네릭 (Generics)</a></p>\n<ul>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#3-1-%EA%B8%B0%EB%B3%B8-%EC%A0%9C%EB%84%A4%EB%A6%AD\">3-1. 기본 제네릭</a></li>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#3-2-%EC%A0%9C%EB%84%A4%EB%A6%AD-%EC%A0%9C%EC%95%BD-%EC%A1%B0%EA%B1%B4\">3-2. 제네릭 제약 조건</a></li>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#3-3-%EC%A0%9C%EB%84%A4%EB%A6%AD-%EC%9C%A0%ED%8B%B8%EB%A6%AC%ED%8B%B0\">3-3. 제네릭 유틸리티</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#4-%EA%B3%A0%EA%B8%89-%ED%83%80%EC%9E%85\">4. 고급 타입</a></p>\n<ul>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#4-1-%EC%A1%B0%EA%B1%B4%EB%B6%80-%ED%83%80%EC%9E%85-conditional-types\">4-1. 조건부 타입 (Conditional Types)</a></li>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#4-2-%EB%A7%A4%ED%95%91%EB%90%9C-%ED%83%80%EC%9E%85-mapped-types\">4-2. 매핑된 타입 (Mapped Types)</a></li>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#4-3-%ED%85%9C%ED%94%8C%EB%A6%BF-%EB%A6%AC%ED%84%B0%EB%9F%B4-%ED%83%80%EC%9E%85\">4-3. 템플릿 리터럴 타입</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#5-%EC%9C%A0%ED%8B%B8%EB%A6%AC%ED%8B%B0-%ED%83%80%EC%9E%85\">5. 유틸리티 타입</a></p>\n<ul>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#5-1-%EA%B8%B0%EB%B3%B8-%EC%9C%A0%ED%8B%B8%EB%A6%AC%ED%8B%B0-%ED%83%80%EC%9E%85\">5-1. 기본 유틸리티 타입</a></li>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#5-2-%EA%B3%A0%EA%B8%89-%EC%9C%A0%ED%8B%B8%EB%A6%AC%ED%8B%B0-%ED%83%80%EC%9E%85\">5-2. 고급 유틸리티 타입</a></li>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#5-3-%EC%BB%A4%EC%8A%A4%ED%85%80-%EC%9C%A0%ED%8B%B8%EB%A6%AC%ED%8B%B0-%ED%83%80%EC%9E%85\">5-3. 커스텀 유틸리티 타입</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#6-%ED%83%80%EC%9E%85-%EA%B0%80%EB%93%9C%EC%99%80-%ED%83%80%EC%9E%85-%EB%8B%A8%EC%96%B8\">6. 타입 가드와 타입 단언</a></p>\n<ul>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#6-1-%ED%83%80%EC%9E%85-%EA%B0%80%EB%93%9C\">6-1. 타입 가드</a></li>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#6-2-%EC%BB%A4%EC%8A%A4%ED%85%80-%ED%83%80%EC%9E%85-%EA%B0%80%EB%93%9C\">6-2. 커스텀 타입 가드</a></li>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#6-3-%ED%83%80%EC%9E%85-%EB%8B%A8%EC%96%B8\">6-3. 타입 단언</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#7-%EB%AA%A8%EB%93%88-%EC%8B%9C%EC%8A%A4%ED%85%9C\">7. 모듈 시스템</a></p>\n<ul>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#7-1-es-%EB%AA%A8%EB%93%88\">7-1. ES 모듈</a></li>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#7-2-%EB%84%A4%EC%9E%84%EC%8A%A4%ED%8E%98%EC%9D%B4%EC%8A%A4\">7-2. 네임스페이스</a></li>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#7-3-%ED%83%80%EC%9E%85-%EC%84%A0%EC%96%B8-%ED%8C%8C%EC%9D%BC-dts\">7-3. 타입 선언 파일 (.d.ts)</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#8-%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0-decorators\">8. 데코레이터 (Decorators)</a></p>\n<ul>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#8-1-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0\">8-1. 클래스 데코레이터</a></li>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#8-2-%EC%86%8D%EC%84%B1-%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0\">8-2. 속성 데코레이터</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#9-%EC%8B%A4%EC%A0%84-%ED%8C%A8%ED%84%B4\">9. 실전 패턴</a></p>\n<ul>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#9-1-%EB%B9%8C%EB%8D%94-%ED%8C%A8%ED%84%B4\">9-1. 빌더 패턴</a></li>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#9-2-%ED%8C%A9%ED%86%A0%EB%A6%AC-%ED%8C%A8%ED%84%B4\">9-2. 팩토리 패턴</a></li>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#9-3-%EC%8B%B1%EA%B8%80%ED%86%A4-%ED%8C%A8%ED%84%B4\">9-3. 싱글톤 패턴</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#10-%ED%83%80%EC%9E%85-%EC%95%88%EC%A0%84%EC%84%B1-%EB%AA%A8%EB%B2%94-%EC%82%AC%EB%A1%80\">10. 타입 안전성 모범 사례</a></p>\n<ul>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#10-1-%EC%97%84%EA%B2%A9%ED%95%9C-%ED%83%80%EC%9E%85-%EC%82%AC%EC%9A%A9\">10-1. 엄격한 타입 사용</a></li>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#10-2-%ED%83%80%EC%9E%85-%EA%B0%80%EB%93%9C-%ED%99%9C%EC%9A%A9\">10-2. 타입 가드 활용</a></li>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#10-3-%EC%A0%9C%EB%84%A4%EB%A6%AD-%ED%99%9C%EC%9A%A9\">10-3. 제네릭 활용</a></li>\n</ul>\n</li>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#11-%EA%B2%B0%EB%A1%A0\">11. 결론</a></li>\n<li><a href=\"/javascript/TypeScript-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EB%B6%80%ED%84%B0-%EA%B3%A0%EA%B8%89-%ED%8C%A8%ED%84%B4%EA%B9%8C%EC%A7%80/#%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C\">참고 자료</a></li>\n</ul>\n</li>\n</ul>","wordCount":{"words":258},"fields":{"slug":"/javascript/TypeScript-완전정복-타입-시스템부터-고급-패턴까지/","image":null,"faq":[]},"frontmatter":{"title":"TypeScript 완전정복 - 타입 시스템부터 고급 패턴까지","date":"2025년 11월 28일","dateISO":"2025-11-28T00:00:00.000Z","updatedISO":null,"category":"javascript","description":"TypeScript의 타입 시스템부터 고급 패턴까지 실전 예제와 함께 완벽하게 정리합니다. 제네릭, 유틸리티 타입, 조건부 타입, 타입 가드, 모듈 시스템 등 TypeScript의 모든 것을 다룹니다.","tags":["TypeScript","타입 시스템","제네릭","유틸리티 타입","JavaScript","프론트엔드","웹 개발"]}}},"pageContext":{"slug":"/javascript/TypeScript-완전정복-타입-시스템부터-고급-패턴까지/","previous":{"fields":{"slug":"/ai/마인드업로드-시리즈-Part-3-뇌-시뮬레이션/"},"frontmatter":{"title":"마인드업로드 시리즈 Part 3 - 뇌 시뮬레이션, 디지털 뇌를 만드는 기술","tags":["마인드업로드","Mind Upload","뇌 시뮬레이션","Brain Simulation","뉴런 모델링","시냅스 시뮬레이션","Whole Brain Emulation","Blue Brain Project","Human Brain Project","NEURON","뇌 컴퓨팅"]}},"next":{"fields":{"slug":"/etc/OAuth-2.0과-JWT-완전정복-인증-인가-실전-가이드/"},"frontmatter":{"title":"OAuth 2.0과 JWT 완전정복 - 인증/인가 실전 가이드","tags":["OAuth 2.0","JWT","인증","인가","보안","API","웹 개발","백엔드"]}}}},"staticQueryHashes":["213619243","3262363727"]}