{"id":259,"date":"2026-03-09T20:20:23","date_gmt":"2026-03-09T20:20:23","guid":{"rendered":"https:\/\/blog.rebalai.com\/ko\/2026\/03\/09\/typescript-5x-in-2026-features-that-actually-matte\/"},"modified":"2026-03-09T20:20:23","modified_gmt":"2026-03-09T20:20:23","slug":"typescript-5x-in-2026-features-that-actually-matte","status":"publish","type":"post","link":"https:\/\/blog.rebalai.com\/ko\/2026\/03\/09\/typescript-5x-in-2026-features-that-actually-matte\/","title":{"rendered":"TypeScript 5.x in 2026: \ud504\ub85c\ub355\uc158 \ucf54\ub4dc\uc5d0\uc11c \uc2e4\uc81c\ub85c \uc911\uc694\ud55c \uae30\ub2a5\ub4e4"},"content":{"rendered":"<p>TypeScript 5.0\uc774 \ub098\uc628 \uac8c 2023\ub144 \ucd08\uc600\ub294\ub370, 2026\ub144 \ud604\uc7ac 5.8\uae4c\uc9c0 \uc654\ub2e4. \uadf8 \uc0ac\uc774\uc5d0 \uc815\ub9d0 \ub9ce\uc740 \uae30\ub2a5\uc774 \ucd94\uac00\ub410\uc9c0\ub9cc \uc194\uc9c1\ud788 \ub300\ubd80\ubd84\uc740 &#8220;\uc788\uc73c\uba74 \uc88b\uace0 \uc5c6\uc5b4\ub3c4 \uadf8\ub9cc&#8221;\uc778 \uc218\uc900\uc774\ub2e4. \ub0b4\uac00 \uc9c0\ub09c 2\ub144 \ub3d9\uc548 \uc2e4\uc81c \ud504\ub85c\ub355\uc158 \ucf54\ub4dc\uc5d0\uc11c \uc758\ubbf8 \uc788\uac8c \uc0ac\uc6a9\ud55c \uae30\ub2a5\uc740 \uc190\uac00\ub77d\uc5d0 \uaf3d\uc744 \uc815\ub3c4\ub2e4. \uc774 \uae00\uc740 \uadf8\uac83\ub9cc \ub2e4\ub8ec\ub2e4.<\/p>\n<p>\ucc38\uace0\ub85c \ub0b4 \ud658\uacbd: Next.js \uae30\ubc18 SaaS, \ubc31\uc5d4\ub4dc\ub294 Node.js + PostgreSQL, \ud300\uc740 7\uba85. \uaddc\ubaa8\uac00 \uc791\uc740 \ud3b8\uc774\uc9c0\ub9cc \ucf54\ub4dc\ubca0\uc774\uc2a4\ub294 \uaf64 \ucee4\uc11c \ud0c0\uc785 \uac80\uc0ac \uc2dc\uac04 \ubb38\uc81c\ub85c \uc5ec\ub7ec \ubc88 \uace0\uc0dd\ud588\ub2e4.<\/p>\n<h2><code>using<\/code>\uc73c\ub85c \ub9ac\uc18c\uc2a4 \uad00\ub9ac\uac00 \ub2ec\ub77c\uc84c\ub2e4 \u2014 \uc9c4\uc9dc\ub85c<\/h2>\n<p>TypeScript 5.2\uc5d0\uc11c \ub098\uc628 <code>using<\/code> \uc120\uc5b8\uc740 \ucc98\uc74c \ubd24\uc744 \ub54c \ubcc4\ub85c\uc600\ub2e4. Rust\uc758 <code>Drop<\/code> \ud2b8\ub808\uc774\ud2b8\ub098 Python\uc758 <code>with<\/code> \ubb38\uc744 \ud749\ub0b4 \ub0b8 \uac74\ub370, &#8220;JS\uc5d0\uc11c \uad73\uc774?&#8221; \uc2f6\uc5c8\ub2e4. \uc6b0\ub9ac \ud300\ub3c4 try-finally \ud328\ud134\uc73c\ub85c \uc798 \ubc84\ud2f0\uace0 \uc788\uc5c8\uace0.<\/p>\n<p>\uadf8\ub7f0\ub370 \uc791\ub144 \uac00\uc744, \uc11c\ube44\uc2a4 \ud2b8\ub798\ud53d\uc774 \uac11\uc790\uae30 \ub450 \ubc30\ub85c \ub6f0\uba74\uc11c DB \ucee4\ub125\uc158 \ud480\uc774 \uace0\uac08\ub418\ub294 \uc77c\uc774 \uc0dd\uacbc\ub2e4. \uc6d0\uc778\uc744 \ud30c\ubcf4\ub2c8 \uc624\ub958 \ucc98\ub9ac \uacbd\ub85c\uc5d0\uc11c \ucee4\ub125\uc158\uc744 \uc81c\ub300\ub85c \ubc18\ud658\ud558\uc9c0 \uc54a\ub294 \ucf54\ub4dc\uac00 \uc5ec\uae30\uc800\uae30 \ud769\uc5b4\uc838 \uc788\uc5c8\ub2e4. \ud300\uc6d0\uc774 finally \ube14\ub85d\uc744 \ube60\ub728\ub9b0 \uac8c \uc544\ub2c8\ub77c, finally \ube14\ub85d \uc548\uc5d0\uc11c \ub610 \uc608\uc678\uac00 \ub098\ub294 \ucf00\uc774\uc2a4\ub97c \ucc98\ub9ac\ud558\uc9c0 \uc54a\uc740 \uac70\uc600\ub2e4. \uc774\uac8c \uc0dd\uac01\ubcf4\ub2e4 \ucc3e\uae30 \uc5b4\ub835\ub2e4.<\/p>\n<pre><code class=\"language-typescript\">\/\/ \uae30\uc874 \ubc29\uc2dd \u2014 finally\uc5d0\uc11c \uc624\ub958\uac00 \ub098\uba74 \uc6d0\ub798 \uc624\ub958\uac00 \ubb3b\ud78c\ub2e4\nasync function processOrder(orderId: string) {\n  const conn = await pool.acquire();\n  try {\n    const order = await conn.query('SELECT * FROM orders WHERE id = $1', [orderId]);\n    await conn.query('UPDATE orders SET status = $1 WHERE id = $2', ['processing', orderId]);\n    return order;\n  } finally {\n    await conn.release(); \/\/ \uc5ec\uae30\uc11c \uc608\uc678 \ub098\uba74? \uc6d0\ub798 \uc624\ub958 \uc2a4\ud0dd \uc0ac\ub77c\uc9d0\n  }\n}\n\n\/\/ using \ubc29\uc2dd \u2014 Symbol.asyncDispose\ub97c \uad6c\ud604\ud558\uba74 \uc790\ub3d9\uc73c\ub85c \uc815\ub9ac\ub428\nclass PooledConnection implements AsyncDisposable {\n  constructor(private conn: Connection) {}\n\n  async query(sql: string, params?: unknown[]) {\n    return this.conn.query(sql, params);\n  }\n\n  async [Symbol.asyncDispose]() {\n    await this.conn.release();\n  }\n}\n\nasync function processOrder(orderId: string) {\n  await using conn = new PooledConnection(await pool.acquire());\n  \/\/ \uc5ec\uae30\uc11c \ubb34\uc2a8 \uc77c\uc774 \uc77c\uc5b4\ub098\ub4e0 conn\uc740 \uc2a4\ucf54\ud504 \ub05d\uc5d0\uc11c \ubc18\ub4dc\uc2dc dispose\ub428\n  const order = await conn.query('SELECT * FROM orders WHERE id = $1', [orderId]);\n  await conn.query('UPDATE orders SET status = $1 WHERE id = $2', ['processing', orderId]);\n  return order;\n}\n<\/code><\/pre>\n<p>dispose \uc624\ub958\uc640 \uc6d0\ub798 \uc624\ub958\uac00 \ub458 \ub2e4 \uc0b4\uc544\ub0a8\ub294\ub2e4\ub294 \uc810\uc774 \ud575\uc2ec\uc774\ub2e4. <code>SuppressedError<\/code>\ub77c\ub294 \ud0c0\uc785\uc774 \uc0c8\ub85c \uc0dd\uacbc\ub294\ub370, dispose \uc911 \uc624\ub958\uac00 \ub098\uba74 \uc6d0\ub798 \uc624\ub958\ub97c <code>suppressed<\/code> \uc18d\uc131\uc5d0 \ub2f4\uc544\uc11c \ub358\uc9c4\ub2e4. try-finally \ud328\ud134\uc5d0\uc11c\ub294 \uc774\uac8c \ubd88\uac00\ub2a5\ud588\ub2e4.<\/p>\n<p>\uc6b0\ub9ac \ud300\uc740 \uc774\uac78 DB \ucee4\ub125\uc158\ubfd0\ub9cc \uc544\ub2c8\ub77c \uc784\uc2dc \ud30c\uc77c \ucc98\ub9ac, Redis \ub77d \ud574\uc81c, \uc678\ubd80 API \uc138\uc158 \uad00\ub9ac\uc5d0\ub3c4 \uc801\uc6a9\ud588\ub2e4. 3\uc8fc \ub9cc\uc5d0 DB \ucee4\ub125\uc158 \uad00\ub828 \ubc84\uadf8 \ub9ac\ud3ec\ud2b8\uac00 0\uc73c\ub85c \uc904\uc5c8\ub2e4. \uae30\uc874 \ucf54\ub4dc\ub97c \uc804\ubd80 \ubc14\uafbc \uac74 \uc544\ub2c8\uace0 \uc0c8\ub85c \uc791\uc131\ud558\ub294 \ucf54\ub4dc\ubd80\ud130 \uc801\uc6a9\ud588\ub294\ub370, \uc774 \uc815\ub3c4 \ud6a8\uacfc\uba74 \ucda9\ubd84\ud558\ub2e4.<\/p>\n<p>\ud55c \uac00\uc9c0 \ucc98\uc74c\uc5d0 \ud5f7\uac08\ub838\ub358 \uac83: <code>using<\/code>\uc740 \ube14\ub85d \uc2a4\ucf54\ud504\ub97c \ub530\ub978\ub2e4. <code>if<\/code> \ube14\ub85d \uc548\uc5d0\uc11c \uc120\uc5b8\ud558\uba74 \uadf8 \ube14\ub85d\uc774 \ub05d\ub0a0 \ub54c dispose\ub41c\ub2e4. \ub2f9\uc5f0\ud55c \uac83 \uac19\uc9c0\ub9cc \ucc98\uc74c \uc4f8 \ub54c \uc2e4\uc218\ud558\uae30 \uc27d\ub2e4.<\/p>\n<h2><code>NoInfer&lt;T&gt;<\/code> \u2014 \uc81c\ub124\ub9ad \ud0c0\uc785 \ucd94\ub860\uc758 \uc228\uaca8\uc9c4 \ud568\uc815\uc744 \ub9c9\ub2e4<\/h2>\n<p>TypeScript 5.4\uc5d0\uc11c \ub098\uc628 <code>NoInfer&lt;T&gt;<\/code> \uc720\ud2f8\ub9ac\ud2f0 \ud0c0\uc785\uc740 \ucc98\uc74c\uc5d4 \ubb54\uc9c0 \uc774\ud574\uc870\ucc28 \ubabb \ud588\ub2e4. \uacf5\uc2dd \ubb38\uc11c\ub97c \uc138 \ubc88 \uc77d\uc5c8\ub294\ub370 &#8220;\ucd94\ub860 \uc0ac\uc774\ud2b8\uc5d0\uc11c \uc81c\uc678\ud55c\ub2e4&#8221;\ub294 \uc124\uba85\uc774 \uac10\uc774 \uc548 \uc654\ub2e4. \uc5b4\ub5a4 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\ub294 \uac74\uc9c0 \uc9c1\uc811 \uacaa\uc5b4\ubcf4\uace0 \ub098\uc11c\uc57c \uaca8\uc6b0 \ub0a9\ub4dd\ub410\ub2e4.<\/p>\n<p>\uc6b0\ub9ac \ucf54\ub4dc\ubca0\uc774\uc2a4\uc5d0 \uc774\ub7f0 \ud328\ud134\uc758 \ud568\uc218\uac00 \uc788\uc5c8\ub2e4:<\/p>\n<pre><code class=\"language-typescript\">\/\/ NoInfer \uc5c6\ub294 \ubc84\uc804 \u2014 \uc758\ub3c4\uce58 \uc54a\uac8c \ud0c0\uc785\uc774 widening\ub428\nfunction createRoute&lt;T extends string&gt;(\n  routes: T[],\n  defaultRoute: T  \/\/ T\uac00 routes\uc5d0\uc11c \ucd94\ub860\ub41c \ud6c4 defaultRoute\ub3c4 \uac19\uc740 T\uc5ec\uc57c \ud568\n): Router&lt;T&gt; { \/* ... *\/ }\n\n\/\/ \uc774\ub807\uac8c \ud638\ucd9c\ud558\uba74?\nconst router = createRoute(['home', 'about', 'contact'], 'settings');\n\/\/                                                         ^^^^^^^^^^\n\/\/ \uc5d0\ub7ec\uac00 \ub098\uc57c \ud558\ub294\ub370 \uc548 \ub09c\ub2e4!\n\/\/ TypeScript\uac00 T\ub97c string\uc73c\ub85c widening\ud574\uc11c 'settings'\ub97c \ud5c8\uc6a9\ud574\ubc84\ub9bc\n\n\/\/ NoInfer \uc801\uc6a9 \u2014 \uc774\uc81c \uc81c\ub300\ub85c \ud0c0\uc785 \uccb4\ud06c\ub428\nfunction createRoute&lt;T extends string&gt;(\n  routes: T[],\n  defaultRoute: NoInfer&lt;T&gt;  \/\/ T \ucd94\ub860\uc5d0 \uc601\ud5a5 \uc548 \uc90c, \ud558\uc9c0\ub9cc \ud0c0\uc785\uc740 \uc5ec\uc804\ud788 T\uc5ec\uc57c \ud568\n): Router&lt;T&gt; { \/* ... *\/ }\n\nconst router = createRoute(['home', 'about', 'contact'], 'settings');\n\/\/ \u2717 'settings'\ub294 'home' | 'about' | 'contact'\uc5d0 \uc5c6\uc74c \u2014 \uc5d0\ub7ec!\n\nconst router2 = createRoute(['home', 'about', 'contact'], 'home');\n\/\/ \u2713 OK\n<\/code><\/pre>\n<p>\uc774 \ud328\ud134\uc774 \uc6b0\ub9ac \ucf54\ub4dc\uc5d0\uc11c \uc5bc\ub9c8\ub098 \ub9ce\uc774 \uc4f0\uc774\ub294\uc9c0 Grep \ub3cc\ub824\ubd24\ub354\ub2c8 \ube44\uc2b7\ud55c \ud615\ud0dc\uc758 \uc81c\ub124\ub9ad \ud568\uc218\uac00 23\uac1c\ub098 \uc788\uc5c8\ub2e4. \uadf8\uc911 \uc2e4\uc81c\ub85c \ubc84\uadf8\uac00 \ub420 \uc218 \uc788\ub294 \ucf00\uc774\uc2a4\uac00 5\uac1c\uc600\uace0, \uc804\ubd80 <code>NoInfer<\/code>\ub85c \uace0\ucce4\ub2e4.<\/p>\n<p>\ubc1c\uacac\ud588\uc744 \ub54c \uc57d\uac04 \ud5c8\ud0c8\ud588\ub358 \uac8c \u2014 \uc774\ub7f0 \ud0c0\uc785 \ubc84\uadf8\ub294 \ub7f0\ud0c0\uc784\uc5d0\uc11c \uc7a1\uae30 \uc815\ub9d0 \uc5b4\ub835\ub2e4. \ud0c0\uc785\uc774 <code>string<\/code>\uc73c\ub85c widening\ub418\uba74 \ucef4\ud30c\uc77c\ub3c4 \ud1b5\uacfc\ud558\uace0, \ud14c\uc2a4\ud2b8\ub3c4 \ud1b5\uacfc\ud558\uace0, \uc2e4\uc81c\ub85c \uc798\ubabb\ub41c \uac12\uc774 \ub4e4\uc5b4\uc640\uc57c \ube44\ub85c\uc18c \ubb38\uc81c\uac00 \ub4dc\ub7ec\ub09c\ub2e4. <code>NoInfer<\/code>\ub294 \uc774 \ud5c8\uc810\uc744 \uc124\uacc4 \ub2e8\uacc4\uc5d0\uc11c \ub9c9\ub294\ub2e4.<\/p>\n<h2>\ud0c0\uc785 \uc220\uc5b4 \uc790\ub3d9 \ucd94\ub860 \u2014 \ubc30\uc5f4 <code>filter()<\/code>\uac00 \ub4dc\ub514\uc5b4 \uc81c\ub300\ub85c \uc791\ub3d9\ud55c\ub2e4<\/h2>\n<p>TypeScript 5.5\uc5d0\uc11c \ub098\uc628 inferred type predicates, \uc774\uac8c \uc0dd\uac01\ubcf4\ub2e4 \ud6e8\uc52c \ub354 \ud070 \ubcc0\ud654\ub2e4.<\/p>\n<p>\uae30\uc874\uc5d0 \uc774\ub7f0 \ucf54\ub4dc \uc548 \uc368\ubd24\ub2e4\uace0 \ud560 \uc0ac\ub78c \uc5c6\uc744 \uac83\uc774\ub2e4:<\/p>\n<pre><code class=\"language-typescript\">const items = [1, null, 2, undefined, 3].filter(x =&gt; x !== null &amp;&amp; x !== undefined);\n\/\/ items\uc758 \ud0c0\uc785? (number | null | undefined)[]\n\/\/ \uc6b0\ub9ac\ub294 number[]\ub97c \uae30\ub300\ud588\uc9c0\ub9cc TypeScript\ub294 \ubaa8\ub978\ub2e4\n<\/code><\/pre>\n<p>\uadf8\ub798\uc11c \ub2e4\ub4e4 \uc774\ub7f0 \ud0c0\uc785 \uac00\ub4dc \ud568\uc218\ub97c \ubcc4\ub3c4\ub85c \ub9cc\ub4e4\uc5c8\ub2e4:<\/p>\n<pre><code class=\"language-typescript\">function isNonNullable&lt;T&gt;(value: T): value is NonNullable&lt;T&gt; {\n  return value !== null &amp;&amp; value !== undefined;\n}\nconst items = [1, null, 2, undefined, 3].filter(isNonNullable);\n\/\/ \uc774\uc81c items\ub294 number[] \u2014 \ud558\uc9c0\ub9cc \ubcf4\uc77c\ub7ec\ud50c\ub808\uc774\ud2b8\uac00...\n<\/code><\/pre>\n<p>5.5\ubd80\ud130\ub294 TypeScript\uac00 \ud568\uc218 \ubcf8\ubb38\uc744 \ubd84\uc11d\ud574\uc11c \ud0c0\uc785 \uc220\uc5b4\ub97c \uc790\ub3d9\uc73c\ub85c \ucd94\ub860\ud55c\ub2e4. \uc778\ub77c\uc778 \ud654\uc0b4\ud45c \ud568\uc218\uc5d0\uc11c\ub3c4 \uadf8\ub0e5 \uc791\ub3d9\ud55c\ub2e4:<\/p>\n<pre><code class=\"language-typescript\">\/\/ 5.5+\uc5d0\uc11c\ub294 \uc774\uac8c \uadf8\ub0e5 \ub428\nconst items = [1, null, 2, undefined, 3].filter(x =&gt; x !== null &amp;&amp; x !== undefined);\n\/\/ items: number[] \u2713\n<\/code><\/pre>\n<p>\ucc98\uc74c \uc774\uac78 \ud14c\uc2a4\ud2b8\ud588\uc744 \ub54c \ubc18\uc2e0\ubc18\uc758\ud588\ub2e4. &#8220;\uc124\ub9c8 \uc774\ub807\uac8c \ub2e8\uc21c\ud55c \uac8c \ub420 \ub9ac\uac00?&#8221; \uc2f6\uc5b4\uc11c TypeScript Playground\uc5d0\uc11c \uc9c1\uc811 \ud655\uc778\ud588\ub294\ub370 \uc9c4\uc9dc\ub85c \ub410\ub2e4. \uadf8 \uc21c\uac04 \uc6b0\ub9ac \ucf54\ub4dc\ubca0\uc774\uc2a4\uc5d0\uc11c \ubd88\ud544\uc694\ud55c \ud0c0\uc785 \uac00\ub4dc \ud568\uc218\uac00 \uc5bc\ub9c8\ub098 \ub420\uc9c0 \uad81\uae08\ud574\uc11c \uac80\uc0c9\ud574\ubd24\ub354\ub2c8 <code>value is<\/code> \ud328\ud134\uc774 41\uacf3\uc774\ub098 \uc788\uc5c8\uace0, \uadf8\uc911 \uc808\ubc18 \uac00\uae4c\uc774\ub294 \uc774\uc81c \ud544\uc694 \uc5c6\uc5c8\ub2e4. \uc2e4\uc81c\ub85c \uc81c\uac70\ud55c \ubcf4\uc77c\ub7ec\ud50c\ub808\uc774\ud2b8\uac00 \uc57d 200\uc904.<\/p>\n<p>\ud55c \uac00\uc9c0 \uc8fc\uc758\ud560 \uc810\uc740 \ubcf5\uc7a1\ud55c \uc870\uac74\uc5d0\uc11c\ub294 \ucd94\ub860\uc774 \uc548 \ub420 \uc218 \uc788\ub2e4. \ud2b9\ud788 \uc678\ubd80 \ud568\uc218 \ud638\ucd9c \uacb0\uacfc\ub97c \uae30\ubc18\uc73c\ub85c \ud0c0\uc785\uc744 \uc881\ud788\ub294 \uacbd\uc6b0 \u2014 <code>isValid(x)<\/code> \uac19\uc740 \ud568\uc218\ub97c \uc870\uac74\uc73c\ub85c \uc4f0\uba74 TypeScript\uac00 \uadf8 \ud568\uc218\uc758 \uc758\ubbf8\ub97c \ubaa8\ub974\ub2c8\uae4c \ucd94\ub860\uc744 \ubabb \ud55c\ub2e4. \uc774\ub7f0 \uacbd\uc6b0\uc5d4 \uc5ec\uc804\ud788 \uba85\uc2dc\uc801 \ud0c0\uc785 \uc220\uc5b4\uac00 \ud544\uc694\ud558\ub2e4.<\/p>\n<h2>Isolated Declarations: \ube4c\ub4dc \uc18d\ub3c4 \ubb38\uc81c\uc758 \uc808\ubc18\ucbe4 \ub418\ub294 \ud574\uacb0\ucc45<\/h2>\n<p>\uc774\uac74 \uc194\uc9c1\ud788 \ub0b4\uac00 \ucc98\uc74c\uc5d0 \ub108\ubb34 \ub9ce\uc740 \uac78 \uae30\ub300\ud588\ub2e4\uac00 \uc2e4\ub9dd\ud55c \uae30\ub2a5\uc774\ub2e4.<\/p>\n<p>TypeScript 5.5\uc5d0\uc11c \ub098\uc628 <code>isolatedDeclarations<\/code> \uc635\uc158\uc740 \uac01 \ud30c\uc77c\uc774 \ub2e4\ub978 \ud30c\uc77c\uc758 \ud0c0\uc785 \uc815\ubcf4 \uc5c6\uc774\ub3c4 \ud0c0\uc785 \uc120\uc5b8\uc744 \uc0dd\uc131\ud560 \uc218 \uc788\ub3c4\ub85d \uac15\uc81c\ud55c\ub2e4. \uc774\ub807\uac8c \ud558\uba74 <code>.d.ts<\/code> \ud30c\uc77c\uc744 \ubcd1\ub82c\ub85c \uc0dd\uc131\ud560 \uc218 \uc788\uace0, \ub300\uaddc\ubaa8 \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \ube4c\ub4dc \uc18d\ub3c4\uac00 \ud06c\uac8c \ud5a5\uc0c1\ub420 \uc218 \uc788\ub2e4\ub294 \uac8c \uacf5\uc2dd \uc124\uba85\uc774\ub2e4.<\/p>\n<pre><code class=\"language-json\">\/\/ tsconfig.json\n{\n  &quot;compilerOptions&quot;: {\n    &quot;isolatedDeclarations&quot;: true,\n    &quot;declaration&quot;: true\n  }\n}\n<\/code><\/pre>\n<p>\uc124\uc815\uc740 \uac04\ub2e8\ud558\ub2e4. \uadfc\ub370 \uc774 \uc635\uc158\uc744 \ucf1c\ub294 \uc21c\uac04 \uae30\uc874 \ucf54\ub4dc\uc5d0\uc11c \uc5d0\ub7ec\uac00 \uc3df\uc544\uc9c4\ub2e4:<\/p>\n<pre><code class=\"language-typescript\">\/\/ isolatedDeclarations \uc704\ubc18 \u2014 \ubc18\ud658 \ud0c0\uc785\uc774 \ucd94\ub860\uc5d0\ub9cc \uc758\uc874\ud568\nexport function getUser() {  \/\/ \u2717 \ubc18\ud658 \ud0c0\uc785 \uba85\uc2dc \ud544\uc694\n  return { id: 1, name: 'Alex' };\n}\n\n\/\/ \uc62c\ubc14\ub978 \ubc29\uc2dd\nexport function getUser(): { id: number; name: string } {  \/\/ \u2713\n  return { id: 1, name: 'Alex' };\n}\n<\/code><\/pre>\n<p>\uc6b0\ub9ac \ud300 \uae30\uc900\uc73c\ub85c \uc774 \uc635\uc158\uc744 \ucf30\ub354\ub2c8 \uc5d0\ub7ec\uac00 340\uac1c \ub098\uc654\ub2e4. \uace0\uce58\ub294 \ub370 \uc774\ud2c0 \uac78\ub838\ub2e4. \uadf8\ub9ac\uace0 \uc2e4\uc81c \ube4c\ub4dc \uc2dc\uac04 \uac1c\uc120\uc740 \uc6b0\ub9ac \uaddc\ubaa8\uc5d0\uc11c \uccb4\uac10\uc774 \uac70\uc758 \uc5c6\uc5c8\ub2e4. \uc774 \uc635\uc158\uc740 esbuild\ub098 Rolldown \uac19\uc740 \ub3c4\uad6c\ub4e4\uc774 \ud0c0\uc785 \uc2a4\ud2b8\ub9ac\ud551\uc744 \ubcd1\ub82c\ub85c \ucc98\ub9ac\ud560 \ub54c \uc758\ubbf8\uac00 \uc788\ub294\ub370, \uc6b0\ub9ac\ub294 \uadf8\ub7f0 \ud30c\uc774\ud504\ub77c\uc778\uc744 \uc4f0\uc9c0 \uc54a\uc558\ub2e4.<\/p>\n<p>\uadf8\ub7f0\ub370 \ub73b\ubc16\uc5d0 \uc88b\uc740 \ubd80\uc791\uc6a9\uc774 \uc0dd\uacbc\ub2e4. \ubaa8\ub4e0 \uacf5\uac1c API \ud568\uc218\uc5d0 \ubc18\ud658 \ud0c0\uc785\uc744 \uba85\uc2dc\ud558\uac8c \ub410\ub354\ub2c8 \ud300\uc6d0\ub4e4\uc774 \ud568\uc218 \uc2dc\uadf8\ub2c8\ucc98\ub9cc \ubcf4\uace0 \uc758\ub3c4\ub97c \ud30c\uc545\ud558\uae30 \ud6e8\uc52c \uc26c\uc6cc\uc84c\ub2e4. \uacb0\uad6d \uc6b0\ub9ac\ub294 \uc635\uc158\uc744 \ub044\uace0 &#8220;\uacf5\uac1c API \ud568\uc218\uc5d0\ub294 \ubc18\ud658 \ud0c0\uc785 \uba85\uc2dc&#8221;\ub97c \ucee8\ubca4\uc158\uc73c\ub85c\ub9cc \uc720\uc9c0\ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \uc808\ucda9\ud588\ub2e4. 100\ub9cc \uba85 \uc774\uc0c1 \uc77c\uc77c \ud65c\uc131 \uc0ac\uc6a9\uc790\ub97c \uac00\uc9c4 \uc11c\ube44\uc2a4\ub098 \uc218\uc2ed \uac1c \ud328\ud0a4\uc9c0\ub97c \uac00\uc9c4 \ubaa8\ub178\ub808\ud3ec\ub77c\uba74 \uc598\uae30\uac00 \ub2e4\ub974\uaca0\uc9c0\ub9cc, \uadf8 \uc774\ud558 \uaddc\ubaa8\uc5d0\uc11c\ub294 \uc11c\ub450\ub97c \ud544\uc694 \uc5c6\ub2e4.<\/p>\n<h2>\uae30\ub300\ud588\ub2e4\uac00 \ubcc4\ub85c\uc600\ub358 \uac83\ub4e4<\/h2>\n<p>\uc194\uc9c1\ud788 \ub9d0\ud558\uba74 \uc2e4\ub9dd\ud55c \uae30\ub2a5\ub4e4\ub3c4 \uc788\ub2e4.<\/p>\n<p>TC39 \ub370\ucf54\ub808\uc774\ud130 (TypeScript 5.0 \uacf5\uc2dd \uc9c0\uc6d0) \u2014 \ucc98\uc74c\uc5d4 \ud765\ubd84\ud588\ub2e4. \uae30\uc874\uc758 \uc2e4\ud5d8\uc801 \ub370\ucf54\ub808\uc774\ud130 \ub300\uc2e0 \ud45c\uc900\uc744 \uc4f8 \uc218 \uc788\ub2e4\ub294 \uac8c \uc88b\uc558\ub2e4. \uadfc\ub370 \uc2e4\uc81c\ub85c \uc368\ubcf4\ub2c8 \uae30\uc874 <code>emitDecoratorMetadata<\/code>\uc5d0 \uc758\uc874\ud558\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub4e4, \ud2b9\ud788 TypeORM\uc774\ub098 NestJS \uc77c\ubd80 \uae30\ub2a5\uc774 TC39 \ub370\ucf54\ub808\uc774\ud130\uc640 \uc644\uc804\ud788 \ud638\ud658\ub418\uc9c0 \uc54a\ub294 \uacbd\uc6b0\uac00 \uc788\uc5c8\ub2e4. 2026\ub144 \ucd08 \ud604\uc7ac\ub3c4 \uc644\uc804\ud788 \ub9e4\ub044\ub7fd\uc9c0\ub294 \uc54a\ub2e4. \uc0c8 \ud504\ub85c\uc81d\ud2b8\ub97c \uc2dc\uc791\ud55c\ub2e4\uba74 TC39 \ub370\ucf54\ub808\uc774\ud130\ub97c \uc4f0\uaca0\uc9c0\ub9cc, \uae30\uc874 \ud504\ub85c\uc81d\ud2b8 \ub9c8\uc774\uadf8\ub808\uc774\uc158\uc740 \uc11c\ub450\ub97c \ud544\uc694 \uc5c6\ub2e4.<\/p>\n<p><code>const<\/code> \ud0c0\uc785 \ud30c\ub77c\ubbf8\ud130 (TypeScript 5.0) \u2014 \uaf64 \uc720\uc6a9\ud558\uace0 \uc54c\uace0 \uc788\ub294 \uc0ac\ub78c\uc774 \uc801\ub2e4. <code>function inferArray&lt;const T extends string[]&gt;(arr: T): T<\/code>\ucc98\ub7fc \uc4f0\uba74 <code>['a', 'b']<\/code>\uac00 <code>string[]<\/code> \ub300\uc2e0 <code>['a', 'b']<\/code> \ud29c\ud50c\ub85c \ucd94\ub860\ub41c\ub2e4. \uadfc\ub370 \uc774\uac8c \ud544\uc694\ud55c \uc0c1\ud669\uc774 \uc0dd\uac01\ubcf4\ub2e4 \uc790\uc8fc \uc624\uc9c0 \uc54a\ub294\ub2e4. \ub0b4 \uacbd\ud5d8\uc0c1 \ub77c\uc774\ube0c\ub7ec\ub9ac \uc791\uc131\uc790\uc5d0\uac8c \ub354 \uc720\uc6a9\ud558\uace0, \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ucf54\ub4dc\uc5d0\uc11c\ub294 \uac00\ub054\uc529\ub9cc \uc4f0\uac8c \ub41c\ub2e4.<\/p>\n<hr \/>\n<p>\ub2f9\uc7a5 \ud504\ub85c\ub355\uc158\uc5d0 \uac00\uc838\ub2e4 \uc368\uc57c \ud558\ub294 \uac74 \uc138 \uac00\uc9c0\ub2e4. <code>using<\/code>\/<code>await using<\/code>\uc73c\ub85c \ub9ac\uc18c\uc2a4 \uad00\ub9ac\ub97c \uc815\ub9ac\ud558\uace0, <code>NoInfer&lt;T&gt;<\/code>\ub85c \uc81c\ub124\ub9ad \ud0c0\uc785 \ucd94\ub860\uc758 \ud5c8\uc810\uc744 \ub9c9\uace0, 5.5\uc758 \ud0c0\uc785 \uc220\uc5b4 \uc790\ub3d9 \ucd94\ub860\uc73c\ub85c \ubd88\ud544\uc694\ud55c \ubcf4\uc77c\ub7ec\ud50c\ub808\uc774\ud2b8\ub97c \uc9c0\uc6b4\ub2e4. \uc774 \uc21c\uc11c\ub300\ub85c \uc801\uc6a9\ud574\ub77c. <code>isolatedDeclarations<\/code>\ub294 \ud300 \uaddc\ubaa8\uc640 \ube4c\ub4dc \ud30c\uc774\ud504\ub77c\uc778\uc744 \uba3c\uc800 \ud3c9\uac00\ud55c \ub4a4 \uacb0\uc815\ud574\ub3c4 \ub2a6\uc9c0 \uc54a\ub2e4.<\/p>\n<p><!-- Reviewed: 2026-03-10 | Status: ready_to_publish | Changes: meta_description expanded with concrete specifics; \"\uade0\ud615\uc744 \ub9de\ucd94\uae30 \uc704\ud574\" AI opener replaced; isolated declarations intro reworded; minor tone\/voice tweaks throughout for naturalness --><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ud504\ub85c\ub355\uc158\uc5d0\uc11c 2\ub144\uac04 \uc4f0\uba74\uc11c \uc2e4\uc81c\ub85c \ucc28\uc774\ub97c \ub9cc\ub4e0 TypeScript 5.x \uae30\ub2a5\ub9cc \ucd94\ub838\ub2e4. using \uc120\uc5b8\uc73c\ub85c DB \ucee4\ub125\uc158 \ubc84\uadf8 \uc81c\uac70, NoInfer<T>\ub85c \ud0c0\uc785 \ud5c8\uc810 \ucc28\ub2e8, 5.5 \ud0c0\uc785 \uc220\uc5b4 \uc790\ub3d9 \ucd94\ub860\uc73c\ub85c \ubcf4\uc77c\ub7ec\ud50c\ub808\uc774\ud2b8 200\uc904 \uc0ad\uc81c.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-259","post","type-post","status-publish","format-standard","hentry","category-general"],"_links":{"self":[{"href":"https:\/\/blog.rebalai.com\/ko\/wp-json\/wp\/v2\/posts\/259","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.rebalai.com\/ko\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.rebalai.com\/ko\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.rebalai.com\/ko\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.rebalai.com\/ko\/wp-json\/wp\/v2\/comments?post=259"}],"version-history":[{"count":0,"href":"https:\/\/blog.rebalai.com\/ko\/wp-json\/wp\/v2\/posts\/259\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.rebalai.com\/ko\/wp-json\/wp\/v2\/media?parent=259"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.rebalai.com\/ko\/wp-json\/wp\/v2\/categories?post=259"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.rebalai.com\/ko\/wp-json\/wp\/v2\/tags?post=259"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}