{"id":518,"date":"2026-05-17T07:04:40","date_gmt":"2026-05-16T23:04:40","guid":{"rendered":"https:\/\/junai.ai\/blog\/ts-practical-patterns-20\/"},"modified":"2026-05-17T07:04:40","modified_gmt":"2026-05-16T23:04:40","slug":"ts-practical-patterns-20","status":"publish","type":"post","link":"https:\/\/junai.ai\/blog\/ts-practical-patterns-20\/","title":{"rendered":"\uc2e4\uc804 \ud328\ud134 \u2014 Result\u00b7Branded (\uc878\uc5c5 20\ud3b8)"},"content":{"rendered":"\n<!-- WordPress REST API \ubc1c\ud589\uc6a9 HTML (\uc790\ub3d9 \uc0dd\uc131) -->\n<!-- WP-FEATURED-MEDIA-ID: 320 -->\n<div style=\"max-width:800px;margin:0 auto;\">\n<style>\n:root{--color-primary:#3178c6;--color-accent:#60a5fa;--color-bg:#fafafa;--color-bg-card:#ffffff;--color-text:#1e293b;--color-text-muted:#64748b;--hero-start:#0f172a;--hero-end:#3178c6;--font-body:-apple-system,BlinkMacSystemFont,'Apple SD Gothic Neo','Noto Sans KR',sans-serif;--size-body:17px;--line-height:1.75;}\n*{box-sizing:border-box;}\n.container{max-width:760px;margin:0 auto;padding:0 22px 80px;}\n.hero{background:linear-gradient(135deg,var(--hero-start) 0%,var(--hero-end) 100%);color:#fff;padding:72px 22px 56px;text-align:center;}\n.hero .badge{display:inline-block;background:rgba(96,165,250,0.18);color:var(--color-accent);padding:6px 14px;border-radius:999px;font-size:13px;font-weight:600;letter-spacing:0.5px;margin-bottom:18px;}\n.hero h1{margin:0 0 18px;font-size:36px;line-height:1.3;letter-spacing:-0.3px;}\n.hero p.sub{margin:0 auto;max-width:580px;font-size:17px;color:#dbeafe;}\n.hero img{width:100%;max-width:720px;height:auto;margin:36px auto 0;display:block;border-radius:10px;box-shadow:0 8px 32px rgba(0,0,0,0.3);}\n.meta{display:flex;gap:14px;justify-content:center;margin-top:20px;font-size:13px;color:#93c5fd;flex-wrap:wrap;}\n.meta span::before{content:\"\u00b7\";margin-right:14px;color:#1e3a8a;}\n.meta span:first-child::before{content:\"\";margin:0;}\narticle{background:var(--color-bg-card);margin-top:-36px;padding:44px 28px;border-radius:14px;box-shadow:0 2px 18px rgba(0,0,0,0.06);}\narticle p{margin:0 0 18px;}\nh2{font-size:28px;line-height:1.35;letter-spacing:-0.3px;margin:48px 0 18px;padding-bottom:10px;border-bottom:2px solid var(--color-primary);}\nh2:first-of-type{margin-top:8px;}\nh3{font-size:21px;line-height:1.4;margin:30px 0 12px;color:var(--color-primary);}\ncode{background:#f1f5f9;color:#0f172a;padding:2px 6px;border-radius:4px;font-family:'SFMono-Regular',Menlo,Consolas,monospace;font-size:0.92em;}\npre{background:#0f172a;color:#e2e8f0;padding:18px 20px;border-radius:10px;overflow-x:auto;font-size:14.5px;line-height:1.65;margin:18px 0;}\npre code{background:transparent;color:inherit;padding:0;}\nul,ol{margin:0 0 18px;padding-left:24px;}\nli{margin-bottom:8px;}\nstrong{color:#0f172a;}\n.databox{background:#eff6ff;border-left:4px solid var(--color-primary);padding:18px 20px;border-radius:6px;margin:22px 0;}\n.databox p{margin:0 0 8px;}\n.databox p:last-child{margin:0;}\n.databox strong{color:var(--color-primary);}\n.warnbox{background:linear-gradient(135deg,#fef3c7 0%,#fde68a 100%);border-left:4px solid #d97706;padding:18px 20px;border-radius:6px;margin:22px 0;}\n.warnbox strong{color:#92400e;}\n.tablewrap{overflow-x:auto;-webkit-overflow-scrolling:touch;margin:22px 0;}\ntable{width:100%;border-collapse:collapse;font-size:15px;background:var(--color-bg-card);}\nth,td{padding:11px 12px;text-align:left;border-bottom:1px solid #e2e8f0;vertical-align:top;}\nth{background:#f1f5f9;font-weight:700;color:#0f172a;}\ntd:first-child,th:first-child{font-weight:700;}\n.cta{background:linear-gradient(135deg,#3178c6 0%,#60a5fa 100%);color:#fff;padding:30px 24px;border-radius:12px;margin-top:44px;text-align:center;}\n.cta h3{color:#fff;margin:0 0 10px;}\n.cta p{margin:0;color:#dbeafe;}\n.series-nav{background:#eff6ff;padding:18px 22px;border-radius:10px;margin-top:24px;font-size:14.5px;color:var(--color-text-muted);}\n.series-nav strong{color:var(--color-primary);}\n@media (max-width:480px){.hero{padding:52px 18px 44px;}.hero h1{font-size:26px;}.hero p.sub{font-size:15px;}article{padding:28px 18px;border-radius:10px;}h2{font-size:22px;}h3{font-size:18px;}body{font-size:16px;}pre{font-size:13px;padding:14px 16px;}}\n@media (max-width:560px){.tablewrap table,.tablewrap thead,.tablewrap tbody,.tablewrap tr,.tablewrap th,.tablewrap td{display:block;width:auto;}.tablewrap thead{display:none;}.tablewrap tr{margin:0 0 14px;border:1px solid #e2e8f0;border-radius:10px;overflow:hidden;}.tablewrap td{border:none;border-bottom:1px solid #f1f5f9;padding:9px 14px;}.tablewrap td:first-child{background:#eff6ff;font-weight:800;font-size:15.5px;}.tablewrap td:last-child{border-bottom:none;}.tablewrap td[data-label]::before{content:attr(data-label) \" \u2014 \";font-weight:700;color:var(--color-primary);}}\n<\/style>\n<header class=\"hero\">\n  <span class=\"badge\">\ud0c0\uc785\uc2a4\ud06c\ub9bd\ud2b8 \uad50\uc7ac \u00b7 20\ud3b8 \/ 20\ud3b8 \u2605\uc644\uacb0<\/span>\n  <h1>\uc2e4\uc804 \ud328\ud134 \u2014 Result\u00b7Branded\u00b7exhaustive<\/h1>\n  <p class=\"sub\">\uc2dc\ub9ac\uc988 \ub9c8\uc9c0\ub9c9. \ucf54\ub4dc\ub97c \uc548\uc804\ud558\uac8c \ub9cc\ub4dc\ub294 4\uac00\uc9c0 \ub3c4\uad6c.<\/p>\n  <div class=\"meta\"><span>\uace0\uae09<\/span><span>\uc77d\ub294 \uc2dc\uac04 8\ubd84<\/span><span>2026-05-17<\/span><\/div>\n  <img decoding=\"async\" src=\"https:\/\/junai.ai\/blog\/wp-content\/uploads\/2026\/05\/hero-92.jpg\" alt=\"Result\u00b7Branded\u00b7exhaustive \ud328\ud134\uc774 \uc2e4\uc81c \ucf54\ub4dc\uc5d0\uc11c \uc5b4\ub5bb\uac8c \uc548\uc804\uc744 \ubcf4\uc7a5\ud558\ub294\uc9c0 \ub3c4\uc2dd\">\n<\/header>\n\n<div class=\"container\">\n<article>\n\n<p>20\ud3b8\uc758 \ub9c8\uc9c0\ub9c9. 1~19\ud3b8\uc758 \ub3c4\uad6c\ub97c \ud569\uccd0 \ub9cc\ub4dc\ub294 <strong>\uc2e4\uc804 \ucf54\ub4dc\uc758 \uc548\uc804 \uc7a5\uce58<\/strong> 4\uac00\uc9c0 \u2014 Result \ud0c0\uc785, Branded \ud0c0\uc785, exhaustive switch, type-safe builder. \uc9c4\uc9dc \ucf54\ub4dc\uc5d0 \ubc14\ub85c \uc801\uc6a9 \uac00\ub2a5\ud55c \ud328\ud134\ub4e4\uc785\ub2c8\ub2e4.<\/p>\n\n<h2>\u2460 Result&lt;T, E&gt; \u2014 try\/catch \ub300\uc548<\/h2>\n\n<pre><code>\/\/ \ud568\uc218\uac00 \"\uc131\uacf5 \ub610\ub294 \uc2e4\ud328\" \ub97c \uba85\uc2dc\uc801\uc73c\ub85c\ntype Result&lt;T, E = Error&gt; =\n  | { ok: true;  value: T }\n  | { ok: false; error: E };\n\n\/\/ \ud5ec\ud37c\nconst ok    = &lt;T&gt;(value: T): Result&lt;T, never&gt; =&gt; ({ ok: true, value });\nconst err   = &lt;E&gt;(error: E): Result&lt;never, E&gt; =&gt; ({ ok: false, error });\n\n\/\/ \uc0ac\uc6a9\nfunction parseInt2(s: string): Result&lt;number, string&gt; {\n  const n = Number(s);\n  if (Number.isNaN(n)) return err(`\"${s}\" \ub294 \uc22b\uc790\uac00 \uc544\ub2d8`);\n  return ok(n);\n}\n\nconst r = parseInt2(input);\nif (r.ok) {\n  console.log(r.value + 1);    \/\/ r.value: number\n} else {\n  console.error(r.error);      \/\/ r.error: string\n}<\/code><\/pre>\n\n<div class=\"databox\">\n  <p><strong>\uc65c Result?<\/strong> try\/catch \ub294 &#8220;\uc5b4\ub5a4 \uc5d0\ub7ec\uac00 \ub0a0 \uc218 \uc788\ub294\uc9c0&#8221; \ud0c0\uc785\uc5d0 \uc548 \ubcf4\uc784. Result \ub294 \uc2dc\uadf8\ub2c8\ucc98\uc5d0 \uc2e4\ud328 \uac00\ub2a5\uc131\uc744 \uba85\uc2dc \u2192 \ud638\ucd9c\uc790\uac00 \ucc98\ub9ac\ub97c \uc78a\uc744 \uc218 \uc5c6\uc74c. Rust\u00b7OCaml \uc758 \uc601\ud5a5.<\/p>\n<\/div>\n\n<h2>\u2461 Branded \ud0c0\uc785 \u2014 \uac19\uc740 string \uc778\ub370 \uc758\ubbf8 \ubd84\ub9ac<\/h2>\n\n<pre><code>\/\/ \uc77c\ubc18 string \ub07c\ub9ac \uc11e\uc774\ub294 \ud568\uc815\nfunction deleteUser(userId: string) { ... }\nfunction getOrder(orderId: string) { ... }\n\ndeleteUser(orderId);   \/\/ \u274c \uc758\ub3c4 \uc548 \ub410\ub294\ub370 \ucef4\ud30c\uc77c \ud1b5\uacfc (\ub458 \ub2e4 string)\n\n\/\/ Branded \u2014 \uac19\uc740 underlying \ud0c0\uc785\uc5d0 \"\ub9c8\ud06c\" \ubd99\uc774\uae30\ntype Brand&lt;T, B&gt; = T &amp; { readonly __brand: B };\n\ntype UserId  = Brand&lt;string, \"UserId\"&gt;;\ntype OrderId = Brand&lt;string, \"OrderId\"&gt;;\n\nfunction UserId(s: string): UserId   { return s as UserId; }\nfunction OrderId(s: string): OrderId { return s as OrderId; }\n\nfunction deleteUser(id: UserId) { ... }\nfunction getOrder(id: OrderId)  { ... }\n\nconst u = UserId(\"u_1\");\nconst o = OrderId(\"o_2\");\n\ndeleteUser(u);   \/\/ OK\ndeleteUser(o);   \/\/ \u274c OrderId \ub294 UserId \uac00 \uc544\ub2d8\n\n\/\/ \ub354 \uc548\uc804 \u2014 \uac80\uc99d\uacfc \ud568\uaed8\nfunction UserId(s: string): UserId {\n  if (!\/^u_\\d+$\/.test(s)) throw new Error(\"invalid UserId\");\n  return s as UserId;\n}<\/code><\/pre>\n\n<div class=\"databox\">\n  <p><strong>Branded \uc758 \uc9c4\uac00.<\/strong> \uac19\uc740 string\u00b7number \uc778\ub370 \uc758\ubbf8\uac00 \ub2e4\ub978 \uac12\ub4e4\uc774 \uc11e\uc774\ub294 \ubc84\uadf8\ub97c \ucef4\ud30c\uc77c \uc2dc\uc810\uc5d0 \ucc28\ub2e8. \uacb0\uc81c \uae08\uc561(<code>Cents<\/code>) vs \uc0c1\ud488 ID(<code>ProductId<\/code>) \ub4f1. \ub7f0\ud0c0\uc784 \ucf54\ub4dc 0.<\/p>\n<\/div>\n\n<h2>\u2462 exhaustive check \u2014 switch \uc758 \ube60\uc9c4 case \uc7a1\uae30<\/h2>\n\n<pre><code>type Shape =\n  | { kind: \"circle\"; radius: number }\n  | { kind: \"square\"; side: number }\n  | { kind: \"rect\";   w: number; h: number };\n\nfunction area(s: Shape): number {\n  switch (s.kind) {\n    case \"circle\": return Math.PI * s.radius ** 2;\n    case \"square\": return s.side ** 2;\n    case \"rect\":   return s.w * s.h;\n    default:\n      const _exhaustive: never = s;   \/\/ \u2190 \uc0c8 case \ucd94\uac00 \uc2dc \ucef4\ud30c\uc77c \uc5d0\ub7ec\n      throw new Error(`Unhandled: ${(s as any).kind}`);\n  }\n}\n\n\/\/ \ub098\uc911\uc5d0 Shape \uc5d0 triangle \ucd94\uac00\ud558\uba74\ntype Shape = ... | { kind: \"triangle\"; base: number; height: number };\n\n\/\/ area \uc758 default \uc5d0\uc11c _exhaustive \uac00 'triangle' \ubc1b\uac8c \ub418\uc5b4\n\/\/ 'triangle' is not assignable to 'never' \u2192 \ucef4\ud30c\uc77c \uc5d0\ub7ec\n\/\/ \u2192 \ube60\uc9c4 case \uc989\uc2dc \ubc1c\uacac<\/code><\/pre>\n\n<h2>\u2463 type-safe builder \u2014 \ub2e8\uacc4\ubcc4 \uac80\uc99d<\/h2>\n\n<pre><code>\/\/ \ud544\uc218 \ud544\ub4dc\ub97c \ube60\ub728\ub9ac\uba74 \ucef4\ud30c\uc77c \uc5d0\ub7ec\ntype EmailDraft = { to: string; subject: string; body: string };\n\nclass EmailBuilder&lt;T = {}&gt; {\n  constructor(private state: T = {} as T) {}\n\n  to(addr: string): EmailBuilder&lt;T &amp; { to: string }&gt; {\n    return new EmailBuilder({ ...this.state, to: addr });\n  }\n\n  subject(s: string): EmailBuilder&lt;T &amp; { subject: string }&gt; {\n    return new EmailBuilder({ ...this.state, subject: s });\n  }\n\n  body(b: string): EmailBuilder&lt;T &amp; { body: string }&gt; {\n    return new EmailBuilder({ ...this.state, body: b });\n  }\n\n  send(this: EmailBuilder&lt;EmailDraft&gt;): void {\n    \/\/ \uc5ec\uae30 \ub3c4\ub2ec\ud588\ub2e4\uba74 T \uac00 EmailDraft \uc640 \ud638\ud658 = \ubaa8\ub4e0 \ud544\ub4dc \uc788\uc74c\n    sendEmail(this.state);\n  }\n}\n\nnew EmailBuilder()\n  .to(\"x@y.com\")\n  .subject(\"Hi\")\n  .body(\"...\")\n  .send();              \/\/ OK\n\nnew EmailBuilder()\n  .to(\"x@y.com\")\n  .send();              \/\/ \u274c subject\u00b7body \uc5c6\uc74c \u2192 \ucef4\ud30c\uc77c \uc5d0\ub7ec<\/code><\/pre>\n\n<h2>\u2464 const assertions \u2014 readonly literal \ud0c0\uc785<\/h2>\n\n<pre><code>\/\/ \uadf8\ub0e5 \uac1d\uccb4 \u2014 \ud0c0\uc785\uc774 \ub108\ubb34 \ub113\uc74c\nconst config = { url: \"https:\/\/api\", timeout: 5000 };\n\/\/ \ud0c0\uc785: { url: string; timeout: number }\n\n\/\/ as const \u2014 \uc815\ud655\ud55c literal\nconst config = { url: \"https:\/\/api\", timeout: 5000 } as const;\n\/\/ \ud0c0\uc785: { readonly url: \"https:\/\/api\"; readonly timeout: 5000 }\n\n\/\/ \ubc30\uc5f4\uc5d0\ub3c4\nconst ROLES = [\"admin\", \"user\", \"guest\"] as const;\ntype Role = typeof ROLES[number];   \/\/ \"admin\" | \"user\" | \"guest\"\n\n\/\/ 11\ud3b8\uc5d0\uc11c \uc774\uac78\ub85c enum \ub300\uccb4<\/code><\/pre>\n\n<h2>\u2465 satisfies \u2014 \ud0c0\uc785\uc740 \uc881\uac8c, \uac12\uc740 \uadf8\ub300\ub85c<\/h2>\n\n<pre><code>type Config = Record&lt;string, string | number&gt;;\n\n\/\/ as Config \u2014 \uc881\ud788\uae30 \uc704\ubc18\nconst cfg: Config = { port: 3000, host: \"x.com\" };\ncfg.port.toFixed(2);   \/\/ \u274c port: string | number\n\n\/\/ satisfies \u2014 \uac80\uc0ac\ud558\ub418 \ud0c0\uc785\uc740 \uc881\uac8c \uc720\uc9c0\nconst cfg = { port: 3000, host: \"x.com\" } satisfies Config;\ncfg.port.toFixed(2);   \/\/ \u2705 port: number \uadf8\ub300\ub85c \uc720\uc9c0\ncfg.host.toUpperCase(); \/\/ \u2705 host: string<\/code><\/pre>\n\n<h2>\u2466 \ud568\uc218 \uc2dc\uadf8\ub2c8\ucc98 \ud55c \uc904\ub85c \ud0c0\uc785 \ucd94\ucd9c<\/h2>\n\n<pre><code>function createUser(name: string, age: number) {\n  return { id: 1, name, age, createdAt: new Date() };\n}\n\n\/\/ \uc77c\uc77c\uc774 \uc801\uc9c0 \ub9d0\uace0\ntype User = ReturnType&lt;typeof createUser&gt;;   \/\/ { id; name; age; createdAt }\ntype Args = Parameters&lt;typeof createUser&gt;;   \/\/ [string, number]<\/code><\/pre>\n\n<h2>\ud83d\udcda 20\ud3b8 \uc2dc\ub9ac\uc988 \ud68c\uace0 \u2014 \ubb34\uc5c7\uc744 \uc775\ud614\ub098<\/h2>\n\n<div class=\"tablewrap\">\n<table>\n  <thead>\n    <tr><th>\ud30c\ud2b8<\/th><th>\ud575\uc2ec<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr><td data-label=\"\">Part 1 \uc785\ubb38(1-4)<\/td><td data-label=\"\">\uc124\uce58\u00b7\uae30\ubcf8 \ud0c0\uc785\u00b7\ud568\uc218\u00b7interface vs type<\/td><\/tr>\n    <tr><td data-label=\"\">Part 2 \uae30\ucd08(5-10)<\/td><td data-label=\"\">\uc720\ub2c8\uc628\u00b7\uc81c\ub124\ub9ad\u00b7enum\u00b7\ud074\ub798\uc2a4\u00b7\ubaa8\ub4c8\u00b7tsconfig<\/td><\/tr>\n    <tr><td data-label=\"\">Part 3 \uc911\uae09(11-15)<\/td><td data-label=\"\">\uc720\ud2f8\ub9ac\ud2f0\u00b7\uc870\uac74\ubd80\u00b7\ub9e4\ud551\u00b7\ud0c0\uc785 \uac00\ub4dc\u00b7\ube44\ub3d9\uae30<\/td><\/tr>\n    <tr><td data-label=\"\">Part 4 \uace0\uae09(16-20)<\/td><td data-label=\"\">\ub370\ucf54\ub808\uc774\ud130\u00b7.d.ts\u00b7strict\u00b7\ube4c\ub4dc\u00b7\uc2e4\uc804 \ud328\ud134<\/td><\/tr>\n  <\/tbody>\n<\/table>\n<\/div>\n\n<div class=\"databox\">\n  <p><strong>\ub2e4\uc74c\uc740?<\/strong> \uc2e4\uc81c \ud504\ub85c\uc81d\ud2b8\uc5d0 \uc801\uc6a9\ud574 \ubcf4\uc138\uc694. \u2460 Next.js\u00b7SvelteKit\u00b7Remix \uac19\uc740 \ud504\ub808\uc784\uc6cc\ud06c\ub85c \ud480\uc2a4\ud0dd \uc571. \u2461 tRPC\u00b7Hono \uac19\uc740 \ud0c0\uc785 \uc548\uc804 API \ub77c\uc774\ube0c\ub7ec\ub9ac. \u2462 Effect\u00b7neverthrow \uac19\uc740 \ud568\uc218\ud615 \ub77c\uc774\ube0c\ub7ec\ub9ac \u2014 Result \ud328\ud134\uc744 \ubcf8\uaca9\uc801\uc73c\ub85c. \u2463 ts-pattern \u2014 exhaustive \ub9e4\uce6d\uc758 \ucc28\uc138\ub300.<\/p>\n<\/div>\n\n<h2>\ub9c8\uc9c0\ub9c9 \ud55c \uc904<\/h2>\n\n<p><strong>&#8220;\ud0c0\uc785\uc740 \ubbf8\ub798\uc758 \uc790\uc2e0\uacfc \ub3d9\ub8cc\ub97c \uc704\ud55c \uba54\ubaa8&#8221;<\/strong>\uc785\ub2c8\ub2e4. \ucc98\uc74c\uc5d0\ub294 \uadc0\ucc2e\uc9c0\ub9cc 6\uac1c\uc6d4 \ub4a4 \ucf54\ub4dc \ub2e4\uc2dc \ubcfc \ub54c \ube5b\ub0a9\ub2c8\ub2e4. \uc0c8 \ucf54\ub4dc\uc5d0 strict \uac00 \ucf1c\uc838 \uc788\ub2e4\uba74 \uc808\ubc18\uc740 \uc774\ubbf8 \uc131\uacf5.<\/p>\n\n<div class=\"cta\">\n  <h3>\ud83c\udf93 \uc2dc\ub9ac\uc988 \uc644\uacb0<\/h3>\n  <p>\uc27d\uac8c \ubc30\uc6b0\ub294 \ud0c0\uc785\uc2a4\ud06c\ub9bd\ud2b8 20\ud3b8 \uc2dc\ub9ac\uc988 \ub05d. \ucc98\uc74c 1\ud3b8\ubd80\ud130 \ub2e4\uc2dc \ubcf4\uba74 \ub450 \ubc88\uc9f8\ub294 \ud6e8\uc52c \uba85\ub8cc\ud560 \uac70\uc608\uc694. \ub2e4\uc74c \ub2e8\uacc4\ub294 \uc2e4\uc81c \ud504\ub85c\uc81d\ud2b8.<\/p>\n<\/div>\n\n<div class=\"series-nav\">\n  <strong>\ud83d\udcda \uc27d\uac8c \ubc30\uc6b0\ub294 \ud0c0\uc785\uc2a4\ud06c\ub9bd\ud2b8 \uad50\uc7ac \u2014 \uc644\uacb0<\/strong><br>\n  \uc774\uc804: 19\ud3b8 \ube4c\ub4dc \uc131\ub2a5 \u00b7 \ud604\uc7ac: <strong>20\ud3b8 (\uc878\uc5c5\uc791 \u2605)<\/strong> \u00b7 \uc9c4\ud589: <strong>20\/20 \u2705<\/strong>\n<\/div>\n\n<\/article>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Result\u00b7Branded\u00b7exhaustive\u00b7builder. \uc2dc\ub9ac\uc988 \ub9c8\uc9c0\ub9c9 20\ud3b8.<\/p>\n","protected":false},"author":1,"featured_media":320,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18],"tags":[],"class_list":["post-518","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-typescript-basic"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/posts\/518","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/comments?post=518"}],"version-history":[{"count":0,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/posts\/518\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/media\/320"}],"wp:attachment":[{"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/media?parent=518"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/categories?post=518"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/tags?post=518"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}