{"id":1005,"date":"2025-09-03T01:44:04","date_gmt":"2025-09-03T01:44:04","guid":{"rendered":"https:\/\/gk.palem.in\/articles\/?p=1005"},"modified":"2025-09-03T01:44:07","modified_gmt":"2025-09-03T01:44:07","slug":"mastering-type-safety-in-ai-development-advanced-branded-types-in-typescript","status":"publish","type":"post","link":"https:\/\/gk.palem.in\/articles\/mastering-type-safety-in-ai-development-advanced-branded-types-in-typescript\/","title":{"rendered":"Mastering Type Safety in AI Development: Advanced Branded Types in TypeScript"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\"><\/h1>\n\n\n\n<p>In my decades of architecting complex software systems, I have witnessed firsthand how type safety becomes the foundation for robust AI applications. As poineers of generative AI and large language models, the need for sophisticated type systems has become important, again, specifically the types that model the underlying domain. In this article, I will share an elegant solution to a persistent challenge in TypeScript development that&#8217;s particularly relevant to AI engineers building next-generation applications.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Type Safety Imperative in AI Development<\/h2>\n\n\n\n<p>Modern AI systems, especially those leveraging generative models, process vast amounts of structured and unstructured data. A single type error can cascade through neural network pipelines, causing subtle bugs that manifest only in production environments. Traditional type systems often fall short when we need to enforce domain-specific constraints at the type level.<\/p>\n\n\n\n<p>Consider an AI system that processes file paths, repository locations, and API endpoints. While these might all be represented as strings at runtime, they carry distinct semantic meanings that should be enforced at compile time. This is where branded types shine, but implementing them correctly has traditionally been fraught with complexity.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">An Elegant Pattern for Hierarchical Branding<\/h2>\n\n\n\n<p>Years of refining type patterns across numerous AI systems, here is my approach to branded types that balances expressiveness with maintainability. The solution elegantly handles hierarchical relationships between types while preserving the root base type and accumulating brand information.<\/p>\n\n\n\n<p>The core insight is to store both the root type and accumulated tags within the brand property itself:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#292D3E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><textarea class=\"code-block-pro-copy-button-textarea\" aria-hidden=\"true\" readonly>declare const __brand: unique symbol;\ntype Brand&lt;Root, Tags extends string> = {\n  readonly [__brand]: {\n    root: Root;\n    tags: Record&lt;Tags, true>;\n  };\n};\n\ntype Branded&lt;Base, Tag extends string> =\n  Base extends { readonly [__brand]: { root: infer R; tags: infer T } }\n    ? R &amp; Brand&lt;R, keyof T &amp; string | Tag>\n    : Base &amp; Brand&lt;Base, Tag>;<\/textarea><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-palenight\" style=\"background-color: #292D3E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">declare<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">const<\/span><span style=\"color: #BABED8\"> __brand<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">unique<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">symbol<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">type<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Brand<\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #FFCB6B\">Root<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Tags<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">extends<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">string<\/span><span style=\"color: #89DDFF\">&gt;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">  <\/span><span style=\"color: #C792EA\">readonly<\/span><span style=\"color: #BABED8\"> [__brand]<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #F07178\">root<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Root<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #F07178\">tags<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Record<\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #FFCB6B\">Tags<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">true<\/span><span style=\"color: #89DDFF\">&gt;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">  <\/span><span style=\"color: #89DDFF\">};<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">type<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Branded<\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #FFCB6B\">Base<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Tag<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">extends<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">string<\/span><span style=\"color: #89DDFF\">&gt;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">  <\/span><span style=\"color: #FFCB6B\">Base<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">extends<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">readonly<\/span><span style=\"color: #BABED8\"> [__brand]<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #F07178\">root<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">infer<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">R<\/span><span style=\"color: #89DDFF\">;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #F07178\">tags<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">infer<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">T<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #89DDFF\">?<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">R<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&amp;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Brand<\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #FFCB6B\">R<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">keyof<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">T<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&amp;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">string<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">|<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Tag<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Base<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&amp;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Brand<\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #FFCB6B\">Base<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Tag<\/span><span style=\"color: #89DDFF\">&gt;;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>This pattern looks simple, yet allows us to create type hierarchies that accurately reflect domain relationships. For instance, we can define a <code>TFolderPath<\/code> type and then extend it to create a <code>TGitRepoRootPath<\/code> that maintains all the properties of a folder path while adding Git-specific semantics.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why This Matters for AI Systems<\/h2>\n\n\n\n<p>In AI development, we frequently deal with specialized data representations that share common structures but have distinct constraints. This pattern provides several key benefits:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Semantic Precision<\/strong>: Types accurately represent domain concepts, preventing category errors in data processing pipelines.<\/li>\n\n\n\n<li><strong>Compile-time Verification<\/strong>: Constraints are enforced before runtime, catching errors that could otherwise corrupt training data or model outputs.<\/li>\n\n\n\n<li><strong>Hierarchical Relationships<\/strong>: Maintains proper subtype relationships, enabling more expressive APIs while preserving type safety.<\/li>\n\n\n\n<li><strong>Zero Runtime Overhead<\/strong>: All branding exists purely at the type level, with no impact on execution performance.<\/li>\n<\/ol>\n\n\n\n<p>This approach has proven invaluable in AI systems where data integrity is paramount\u2014from preprocessing pipelines that feed into neural networks to output validation systems that ensure generated content meets specified criteria.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Path Forward<\/h2>\n\n\n\n<p>As AI systems tend to grow in complexity, sophisticated type patterns like this become increasingly essential. They enable us to build more reliable, maintainable, and self-documenting codebases that can evolve alongside our AI capabilities.<\/p>\n\n\n\n<p>The pattern I have shared represents just one facet of the advanced typing techniques we employ in cutting-edge AI development. There is a rich ecosystem of patterns and practices that can dramatically improve the robustness of AI systems while accelerating development cycles.<\/p>\n\n\n\n<p>If you are building AI applications and recognize the critical role that type safety plays in your architecture, I invite you to <a href=\"\/Contact.html\" data-type=\"link\" data-id=\"\/contact.html\" target=\"_blank\" rel=\"noreferrer noopener\">connect <\/a>with my team. We specialize in architecting enterprise-grade AI systems that leverage advanced type patterns to ensure reliability and maintainability. Whether you are developing generative AI applications, machine learning pipelines, or intelligent automation systems, our expertise can help you avoid common pitfalls and accelerate your path to production.<\/p>\n\n\n\n<p>The future of AI development lies in the intersection of sophisticated type systems and intelligent algorithms. Let&#8217;s build that future together.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Practical Examples: Catching Type Errors with Hierarchical Branded Types in AI Systems<\/h1>\n\n\n\n<p>Let me demonstrate how hierarchical branded types catch critical errors in real-world AI development scenarios.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Core Type Definitions<\/h2>\n\n\n\n<p>First, let&#8217;s establish our branded type hierarchy:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#292D3E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><textarea class=\"code-block-pro-copy-button-textarea\" aria-hidden=\"true\" readonly>declare const __brand: unique symbol;\ntype Brand&lt;Root, Tags extends string> = {\n  readonly [__brand]: {\n    root: Root;\n    tags: Record&lt;Tags, true>;\n  };\n};\n\ntype Branded&lt;Base, Tag extends string> =\n  Base extends { readonly [__brand]: { root: infer R; tags: infer T } }\n    ? R &amp; Brand&lt;R, keyof T &amp; string | Tag>\n    : Base &amp; Brand&lt;Base, Tag>;\n\n\/\/ Define our type hierarchy\ntype TPath = Branded&lt;string, &#8220;Path&#8221;>;\ntype TFolderPath = Branded&lt;TPath, &#8220;FolderPath&#8221;>;\ntype TGitRepoRootPath = Branded&lt;TFolderPath, &#8220;GitRepoRoot&#8221;>;\ntype TConfigPath = Branded&lt;TPath, &#8220;ConfigPath&#8221;>;<\/textarea><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-palenight\" style=\"background-color: #292D3E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">declare<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">const<\/span><span style=\"color: #BABED8\"> __brand<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">unique<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">symbol<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">type<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Brand<\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #FFCB6B\">Root<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Tags<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">extends<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">string<\/span><span style=\"color: #89DDFF\">&gt;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">  <\/span><span style=\"color: #C792EA\">readonly<\/span><span style=\"color: #BABED8\"> [__brand]<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #F07178\">root<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Root<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #F07178\">tags<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Record<\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #FFCB6B\">Tags<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">true<\/span><span style=\"color: #89DDFF\">&gt;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">  <\/span><span style=\"color: #89DDFF\">};<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">type<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Branded<\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #FFCB6B\">Base<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Tag<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">extends<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">string<\/span><span style=\"color: #89DDFF\">&gt;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">=<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">  <\/span><span style=\"color: #FFCB6B\">Base<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">extends<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #C792EA\">readonly<\/span><span style=\"color: #BABED8\"> [__brand]<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #F07178\">root<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">infer<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">R<\/span><span style=\"color: #89DDFF\">;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #F07178\">tags<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">infer<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">T<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #89DDFF\">?<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">R<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&amp;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Brand<\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #FFCB6B\">R<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">keyof<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">T<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&amp;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">string<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">|<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Tag<\/span><span style=\"color: #89DDFF\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #BABED8\">    <\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Base<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&amp;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Brand<\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #FFCB6B\">Base<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Tag<\/span><span style=\"color: #89DDFF\">&gt;;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #676E95; font-style: italic\">\/\/ Define our type hierarchy<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">type<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TPath<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Branded<\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #FFCB6B\">string<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Path<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">&gt;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">type<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TFolderPath<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Branded<\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #FFCB6B\">TPath<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">FolderPath<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">&gt;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">type<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TGitRepoRootPath<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Branded<\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #FFCB6B\">TFolderPath<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">GitRepoRoot<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">&gt;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">type<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TConfigPath<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">Branded<\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #FFCB6B\">TPath<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">ConfigPath<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">&gt;;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Example 1: AI Model Configuration System<\/h2>\n\n\n\n<p>Consider an AI system that processes different types of configuration files:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#292D3E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><textarea class=\"code-block-pro-copy-button-textarea\" aria-hidden=\"true\" readonly>function loadModelConfig(path: TConfigPath): ModelConfig {\n  \/\/ Implementation reads and validates configuration\n  return parseConfigFile(path);\n}\n\nfunction initializeGitRepo(path: TGitRepoRootPath): void {\n  \/\/ Implementation initializes Git repository\n  gitInit(path);\n}\n\n\/\/ Valid usage\nconst configPath: TConfigPath = &#8220;\/app\/config.json&#8221; as TConfigPath;\nconst modelConfig = loadModelConfig(configPath); \/\/ \u2705 Correct\n\nconst repoPath: TGitRepoRootPath = &#8220;\/app\/repo&#8221; as TGitRepoRootPath;\ninitializeGitRepo(repoPath); \/\/ \u2705 Correct\n\n\/\/ Type error examples\nloadModelConfig(repoPath); \/\/ \u274c Error: TGitRepoRootPath is not assignable to TConfigPath\ninitializeGitRepo(configPath); \/\/ \u274c Error: TConfigPath is not assignable to TGitRepoRootPath<\/textarea><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-palenight\" style=\"background-color: #292D3E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">function<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">loadModelConfig<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8; font-style: italic\">path<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TConfigPath<\/span><span style=\"color: #89DDFF\">):<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">ModelConfig<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">  <\/span><span style=\"color: #676E95; font-style: italic\">\/\/ Implementation reads and validates configuration<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">parseConfigFile<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">path<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">function<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">initializeGitRepo<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8; font-style: italic\">path<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TGitRepoRootPath<\/span><span style=\"color: #89DDFF\">):<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">void<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">  <\/span><span style=\"color: #676E95; font-style: italic\">\/\/ Implementation initializes Git repository<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #82AAFF\">gitInit<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">path<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #676E95; font-style: italic\">\/\/ Valid usage<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">const<\/span><span style=\"color: #BABED8\"> configPath<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TConfigPath<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">\/app\/config.json<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">as<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TConfigPath<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">const<\/span><span style=\"color: #BABED8\"> modelConfig <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">loadModelConfig<\/span><span style=\"color: #BABED8\">(configPath)<\/span><span style=\"color: #89DDFF\">;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #676E95; font-style: italic\">\/\/ \u2705 Correct<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">const<\/span><span style=\"color: #BABED8\"> repoPath<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TGitRepoRootPath<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">\/app\/repo<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">as<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TGitRepoRootPath<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">initializeGitRepo<\/span><span style=\"color: #BABED8\">(repoPath)<\/span><span style=\"color: #89DDFF\">;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #676E95; font-style: italic\">\/\/ \u2705 Correct<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #676E95; font-style: italic\">\/\/ Type error examples<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">loadModelConfig<\/span><span style=\"color: #BABED8\">(repoPath)<\/span><span style=\"color: #89DDFF\">;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #676E95; font-style: italic\">\/\/ \u274c Error: TGitRepoRootPath is not assignable to TConfigPath<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">initializeGitRepo<\/span><span style=\"color: #BABED8\">(configPath)<\/span><span style=\"color: #89DDFF\">;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #676E95; font-style: italic\">\/\/ \u274c Error: TConfigPath is not assignable to TGitRepoRootPath<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><strong>Why this matters<\/strong>: In AI systems, configuration files and repository roots serve fundamentally different purposes. This type hierarchy prevents accidentally passing a repository path where a configuration path is expected, which could lead to critical configuration failures.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Example 2: Data Pipeline Processing<\/h2>\n\n\n\n<p>AI data pipelines often process files through various stages, each requiring specific path types:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#292D3E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><textarea class=\"code-block-pro-copy-button-textarea\" aria-hidden=\"true\" readonly>function processTrainingData(folderPath: TFolderPath): TrainingData {\n  \/\/ Implementation processes training data from folder\n  return readAndValidateData(folderPath);\n}\n\nfunction cloneRepository(repoPath: TGitRepoRootPath): void {\n  \/\/ Implementation clones repository\n  gitClone(repoPath);\n}\n\n\/\/ Valid usage\nconst trainingFolder: TFolderPath = &#8220;\/data\/training&#8221; as TFolderPath;\nconst trainingData = processTrainingData(trainingFolder); \/\/ \u2705 Correct\n\nconst modelRepo: TGitRepoRootPath = &#8220;\/models\/llm&#8221; as TGitRepoRootPath;\ncloneRepository(modelRepo); \/\/ \u2705 Correct\n\n\/\/ Type error examples\nprocessTrainingData(modelRepo); \/\/ \u2705 Allowed! GitRepoRootPath is a subtype of FolderPath\ncloneRepository(trainingFolder); \/\/ \u274c Error: TFolderPath is not assignable to TGitRepoRootPath<\/textarea><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-palenight\" style=\"background-color: #292D3E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">function<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">processTrainingData<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8; font-style: italic\">folderPath<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TFolderPath<\/span><span style=\"color: #89DDFF\">):<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TrainingData<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">  <\/span><span style=\"color: #676E95; font-style: italic\">\/\/ Implementation processes training data from folder<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">readAndValidateData<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">folderPath<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">function<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">cloneRepository<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8; font-style: italic\">repoPath<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TGitRepoRootPath<\/span><span style=\"color: #89DDFF\">):<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">void<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">  <\/span><span style=\"color: #676E95; font-style: italic\">\/\/ Implementation clones repository<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #82AAFF\">gitClone<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">repoPath<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #676E95; font-style: italic\">\/\/ Valid usage<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">const<\/span><span style=\"color: #BABED8\"> trainingFolder<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TFolderPath<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">\/data\/training<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">as<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TFolderPath<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">const<\/span><span style=\"color: #BABED8\"> trainingData <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">processTrainingData<\/span><span style=\"color: #BABED8\">(trainingFolder)<\/span><span style=\"color: #89DDFF\">;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #676E95; font-style: italic\">\/\/ \u2705 Correct<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">const<\/span><span style=\"color: #BABED8\"> modelRepo<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TGitRepoRootPath<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">\/models\/llm<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">as<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TGitRepoRootPath<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">cloneRepository<\/span><span style=\"color: #BABED8\">(modelRepo)<\/span><span style=\"color: #89DDFF\">;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #676E95; font-style: italic\">\/\/ \u2705 Correct<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #676E95; font-style: italic\">\/\/ Type error examples<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">processTrainingData<\/span><span style=\"color: #BABED8\">(modelRepo)<\/span><span style=\"color: #89DDFF\">;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #676E95; font-style: italic\">\/\/ \u2705 Allowed! GitRepoRootPath is a subtype of FolderPath<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">cloneRepository<\/span><span style=\"color: #BABED8\">(trainingFolder)<\/span><span style=\"color: #89DDFF\">;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #676E95; font-style: italic\">\/\/ \u274c Error: TFolderPath is not assignable to TGitRepoRootPath<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><strong>Key insight<\/strong>: Notice that <code>TGitRepoRootPath<\/code> can be passed to <code>processTrainingData<\/code> because it&#8217;s a valid folder path. This demonstrates the power of hierarchical types &#8211; more specific types can be used where less specific ones are expected, but not vice versa.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Example 3: AI Model Deployment System<\/h2>\n\n\n\n<p>In deployment scenarios, we need to ensure that paths are used in their appropriate contexts:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#292D3E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><textarea class=\"code-block-pro-copy-button-textarea\" aria-hidden=\"true\" readonly>function deployModel(repoPath: TGitRepoRootPath): DeploymentResult {\n  \/\/ Implementation deploys model from Git repository\n  return deployFromRepository(repoPath);\n}\n\nfunction validatePath(path: TPath): ValidationResult {\n  \/\/ Implementation validates any path\n  return checkPathExists(path);\n}\n\n\/\/ Valid usage\nconst modelRepo: TGitRepoRootPath = &#8220;\/models\/production&#8221; as TGitRepoRootPath;\nconst deployment = deployModel(modelRepo); \/\/ \u2705 Correct\n\nconst anyPath: TPath = &#8220;\/some\/path&#8221; as TPath;\nconst validation = validatePath(anyPath); \/\/ \u2705 Correct\n\n\/\/ Type error examples\ndeployModel(anyPath); \/\/ \u274c Error: TPath is not assignable to TGitRepoRootPath\nvalidatePath(modelRepo); \/\/ \u2705 Allowed! TGitRepoRootPath is a subtype of TPath<\/textarea><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-palenight\" style=\"background-color: #292D3E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">function<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">deployModel<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8; font-style: italic\">repoPath<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TGitRepoRootPath<\/span><span style=\"color: #89DDFF\">):<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">DeploymentResult<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">  <\/span><span style=\"color: #676E95; font-style: italic\">\/\/ Implementation deploys model from Git repository<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">deployFromRepository<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">repoPath<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">function<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">validatePath<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8; font-style: italic\">path<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TPath<\/span><span style=\"color: #89DDFF\">):<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">ValidationResult<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">  <\/span><span style=\"color: #676E95; font-style: italic\">\/\/ Implementation validates any path<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">checkPathExists<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">path<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #676E95; font-style: italic\">\/\/ Valid usage<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">const<\/span><span style=\"color: #BABED8\"> modelRepo<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TGitRepoRootPath<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">\/models\/production<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">as<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TGitRepoRootPath<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">const<\/span><span style=\"color: #BABED8\"> deployment <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">deployModel<\/span><span style=\"color: #BABED8\">(modelRepo)<\/span><span style=\"color: #89DDFF\">;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #676E95; font-style: italic\">\/\/ \u2705 Correct<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">const<\/span><span style=\"color: #BABED8\"> anyPath<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TPath<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">\/some\/path<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">as<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TPath<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">const<\/span><span style=\"color: #BABED8\"> validation <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">validatePath<\/span><span style=\"color: #BABED8\">(anyPath)<\/span><span style=\"color: #89DDFF\">;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #676E95; font-style: italic\">\/\/ \u2705 Correct<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #676E95; font-style: italic\">\/\/ Type error examples<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">deployModel<\/span><span style=\"color: #BABED8\">(anyPath)<\/span><span style=\"color: #89DDFF\">;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #676E95; font-style: italic\">\/\/ \u274c Error: TPath is not assignable to TGitRepoRootPath<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">validatePath<\/span><span style=\"color: #BABED8\">(modelRepo)<\/span><span style=\"color: #89DDFF\">;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #676E95; font-style: italic\">\/\/ \u2705 Allowed! TGitRepoRootPath is a subtype of TPath<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><strong>Critical safety check<\/strong>: This prevents deploying from an arbitrary path that hasn&#8217;t been properly initialized as a Git repository, which could lead to deployment failures or security vulnerabilities.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Example 4: AI Training Data Management<\/h2>\n\n\n\n<p>Consider a system that manages different types of data paths:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#292D3E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><textarea class=\"code-block-pro-copy-button-textarea\" aria-hidden=\"true\" readonly>function preprocessData(folderPath: TFolderPath): ProcessedData {\n  \/\/ Implementation preprocesses data in folder\n  return transformData(folderPath);\n}\n\nfunction setupGitRepo(repoPath: TGitRepoRootPath): void {\n  \/\/ Implementation sets up Git repository\n  initializeRepository(repoPath);\n}\n\n\/\/ Valid usage\nconst dataFolder: TFolderPath = &#8220;\/data\/raw&#8221; as TFolderPath;\nconst processedData = preprocessData(dataFolder); \/\/ \u2705 Correct\n\nconst experimentRepo: TGitRepoRootPath = &#8220;\/experiments\/llm-v2&#8221; as TGitRepoRootPath;\nsetupGitRepo(experimentRepo); \/\/ \u2705 Correct\n\n\/\/ Type error examples\npreprocessData(experimentRepo); \/\/ \u2705 Allowed! GitRepoRootPath is a subtype of FolderPath\nsetupGitRepo(dataFolder); \/\/ \u274c Error: TFolderPath is not assignable to TGitRepoRootPath<\/textarea><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-palenight\" style=\"background-color: #292D3E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">function<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">preprocessData<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8; font-style: italic\">folderPath<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TFolderPath<\/span><span style=\"color: #89DDFF\">):<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">ProcessedData<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">  <\/span><span style=\"color: #676E95; font-style: italic\">\/\/ Implementation preprocesses data in folder<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #F07178\"> <\/span><span style=\"color: #82AAFF\">transformData<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">folderPath<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">function<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">setupGitRepo<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #BABED8; font-style: italic\">repoPath<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TGitRepoRootPath<\/span><span style=\"color: #89DDFF\">):<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">void<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">  <\/span><span style=\"color: #676E95; font-style: italic\">\/\/ Implementation sets up Git repository<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F07178\">  <\/span><span style=\"color: #82AAFF\">initializeRepository<\/span><span style=\"color: #F07178\">(<\/span><span style=\"color: #BABED8\">repoPath<\/span><span style=\"color: #F07178\">)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #676E95; font-style: italic\">\/\/ Valid usage<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">const<\/span><span style=\"color: #BABED8\"> dataFolder<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TFolderPath<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">\/data\/raw<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">as<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TFolderPath<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">const<\/span><span style=\"color: #BABED8\"> processedData <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #82AAFF\">preprocessData<\/span><span style=\"color: #BABED8\">(dataFolder)<\/span><span style=\"color: #89DDFF\">;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #676E95; font-style: italic\">\/\/ \u2705 Correct<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">const<\/span><span style=\"color: #BABED8\"> experimentRepo<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TGitRepoRootPath<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">\/experiments\/llm-v2<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">as<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #FFCB6B\">TGitRepoRootPath<\/span><span style=\"color: #89DDFF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">setupGitRepo<\/span><span style=\"color: #BABED8\">(experimentRepo)<\/span><span style=\"color: #89DDFF\">;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #676E95; font-style: italic\">\/\/ \u2705 Correct<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #676E95; font-style: italic\">\/\/ Type error examples<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">preprocessData<\/span><span style=\"color: #BABED8\">(experimentRepo)<\/span><span style=\"color: #89DDFF\">;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #676E95; font-style: italic\">\/\/ \u2705 Allowed! GitRepoRootPath is a subtype of FolderPath<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">setupGitRepo<\/span><span style=\"color: #BABED8\">(dataFolder)<\/span><span style=\"color: #89DDFF\">;<\/span><span style=\"color: #BABED8\"> <\/span><span style=\"color: #676E95; font-style: italic\">\/\/ \u274c Error: TFolderPath is not assignable to TGitRepoRootPath<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><strong>Practical implication<\/strong>: This ensures that while we can preprocess data from a Git repository (since it&#8217;s a valid folder), we cannot accidentally set up a Git repository in a folder that wasn&#8217;t intended to be one.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why This Matters for AI Development<\/h2>\n\n\n\n<p>In my experience building large-scale AI systems, these type safety patterns have prevented countless subtle bugs that could have compromised data integrity or system reliability. The hierarchical branded type approach:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Prevents Category Errors<\/strong>: Ensures that paths are used only in their appropriate contexts<\/li>\n\n\n\n<li><strong>Enables Safe Refactoring<\/strong>: Allows confident evolution of type hierarchies as systems grow<\/li>\n\n\n\n<li><strong>Documents Domain Knowledge<\/strong>: Encodes important relationships directly in the type system<\/li>\n\n\n\n<li><strong>Catches Errors Early<\/strong>: Identifies issues at compile time rather than in production<\/li>\n<\/ol>\n\n\n\n<p>These patterns are particularly valuable in AI development where data flows through complex pipelines and the distinction between different types of paths, configurations, and data sources is critical to system integrity.<\/p>\n\n\n\n<p>If you are building sophisticated AI systems and recognize the importance of robust type safety in your architecture, I invite you to explore how these patterns can be tailored to your specific domain challenges. The right type system can be the foundation of AI systems that are not only powerful but also reliable and maintainable.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In my decades of architecting complex software systems, I have witnessed firsthand how type safety becomes the foundation for robust AI applications. As poineers of generative AI and large language models, the need for sophisticated type systems has become important, again, specifically the types that model the underlying domain. In this article, I will share an elegant solution to a persistent challenge in TypeScript development that&#8217;s particularly relevant to AI engineers building next-generation applications.<\/p>\n","protected":false},"author":1,"featured_media":1009,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_post_was_ever_published":false,"_cloudinary_featured_overwrite":false,"fifu_image_url":"https:\/\/live.staticflickr.com\/65535\/54762367995_0a644e53b0_w.jpg","fifu_image_alt":"","footnotes":""},"categories":[28,69],"tags":[26,70],"class_list":["post-1005","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai","category-blog","tag-artificial-intelligence","tag-javascript"],"jetpack_featured_media_url":"https:\/\/live.staticflickr.com\/65535\/54762367995_0a644e53b0_w.jpg","jetpack-related-posts":[],"jetpack_shortlink":"https:\/\/wp.me\/pfLaRd-gd","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/gk.palem.in\/articles\/wp-json\/wp\/v2\/posts\/1005","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gk.palem.in\/articles\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gk.palem.in\/articles\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gk.palem.in\/articles\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gk.palem.in\/articles\/wp-json\/wp\/v2\/comments?post=1005"}],"version-history":[{"count":3,"href":"https:\/\/gk.palem.in\/articles\/wp-json\/wp\/v2\/posts\/1005\/revisions"}],"predecessor-version":[{"id":1008,"href":"https:\/\/gk.palem.in\/articles\/wp-json\/wp\/v2\/posts\/1005\/revisions\/1008"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gk.palem.in\/articles\/wp-json\/wp\/v2\/media\/1009"}],"wp:attachment":[{"href":"https:\/\/gk.palem.in\/articles\/wp-json\/wp\/v2\/media?parent=1005"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gk.palem.in\/articles\/wp-json\/wp\/v2\/categories?post=1005"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gk.palem.in\/articles\/wp-json\/wp\/v2\/tags?post=1005"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}