[{"data":1,"prerenderedAt":1174},["ShallowReactive",2],{"navigation:en":3,"\u002Fblog\u002Fprimeros-pasos-typescript-nuxt-4":311},[4],{"title":5,"path":6,"stem":7,"children":8,"icon":10},"Nuxfire Docs","\u002Fdocs","docs\u002F0.index",[9,11,152],{"title":5,"path":6,"stem":7,"icon":10},"i-lucide-layout-grid",{"title":12,"path":13,"stem":14,"children":15,"icon":151},"SaaS Starter Kit","\u002Fdocs\u002Fsaas-starter-kit","docs\u002F1.saas-starter-kit\u002F0.index",[16,19,63,129],{"title":17,"path":13,"stem":14,"icon":18},"What is the SaaS Starter Kit?","i-lucide-info",{"title":20,"icon":21,"hide":22,"path":23,"stem":24,"children":25,"page":62},"Getting Started","i-lucide-play",true,"\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started","docs\u002F1.saas-starter-kit\u002F1.getting-started",[26,30,34,38,42,46,50,54,58],{"title":27,"path":28,"stem":29},"Quick Start","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fquick-start","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F0.quick-start",{"title":31,"path":32,"stem":33},"Installation","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Finstallation","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F1.installation",{"title":35,"path":36,"stem":37},"Cloudflare Access","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fcloudflare-access","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F2.cloudflare-access",{"title":39,"path":40,"stem":41},"Configuration","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fconfiguration","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F3.configuration",{"title":43,"path":44,"stem":45},"Secrets","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fsecrets","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F4.secrets",{"title":47,"path":48,"stem":49},"Environment Variables","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fenvironment-variables","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F5.environment-variables",{"title":51,"path":52,"stem":53},"Deploy","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fdeploy","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F6.deploy",{"title":55,"path":56,"stem":57},"Local Development","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Flocal-development","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F7.local-development",{"title":59,"path":60,"stem":61},"Project Structure","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fproject-structure","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F8.project-structure",false,{"title":64,"icon":65,"hide":22,"path":66,"stem":67,"children":68,"page":62},"Features","i-lucide-box","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures","docs\u002F1.saas-starter-kit\u002F2.features",[69,73,77,81,85,89,93,97,101,105,109,113,117,121,125],{"title":70,"path":71,"stem":72},"Authentication","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fauth","docs\u002F1.saas-starter-kit\u002F2.features\u002F1.auth",{"title":74,"path":75,"stem":76},"Rate Limiting","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Frate-limiting","docs\u002F1.saas-starter-kit\u002F2.features\u002F10.rate-limiting",{"title":78,"path":79,"stem":80},"WebSockets","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fwebsockets","docs\u002F1.saas-starter-kit\u002F2.features\u002F11.websockets",{"title":82,"path":83,"stem":84},"Blog","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fblog","docs\u002F1.saas-starter-kit\u002F2.features\u002F14.blog",{"title":86,"path":87,"stem":88},"Documentation","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fdocumentation","docs\u002F1.saas-starter-kit\u002F2.features\u002F15.documentation",{"title":90,"path":91,"stem":92},"Analytics","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fanalytics","docs\u002F1.saas-starter-kit\u002F2.features\u002F16.analytics",{"title":94,"path":95,"stem":96},"Platform Admin Console","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fplatform-admin","docs\u002F1.saas-starter-kit\u002F2.features\u002F17.platform-admin",{"title":98,"path":99,"stem":100},"Database","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fdatabase","docs\u002F1.saas-starter-kit\u002F2.features\u002F2.database",{"title":102,"path":103,"stem":104},"Payments & Billing","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fpayments","docs\u002F1.saas-starter-kit\u002F2.features\u002F3.payments",{"title":106,"path":107,"stem":108},"Emails","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Femails","docs\u002F1.saas-starter-kit\u002F2.features\u002F4.emails",{"title":110,"path":111,"stem":112},"Notifications","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fnotifications","docs\u002F1.saas-starter-kit\u002F2.features\u002F5.notifications",{"title":114,"path":115,"stem":116},"Role-Based Access Control","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Frbac","docs\u002F1.saas-starter-kit\u002F2.features\u002F6.rbac",{"title":118,"path":119,"stem":120},"Async Jobs","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fasync-jobs","docs\u002F1.saas-starter-kit\u002F2.features\u002F7.async-jobs",{"title":122,"path":123,"stem":124},"Storage","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fstorage","docs\u002F1.saas-starter-kit\u002F2.features\u002F8.storage",{"title":126,"path":127,"stem":128},"Internationalization","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Finternationalization","docs\u002F1.saas-starter-kit\u002F2.features\u002F9.internationalization",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":62},"Concepts","i-lucide-graduation-cap","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts","docs\u002F1.saas-starter-kit\u002F3.concepts",[135,139,143,147],{"title":136,"path":137,"stem":138},"Technology Stack","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Ftech-stack","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F0.tech-stack",{"title":140,"path":141,"stem":142},"SST.dev","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Fsst","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F1.sst",{"title":144,"path":145,"stem":146},"NuxtHub","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Fnuxt-hub","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F2.nuxt-hub",{"title":148,"path":149,"stem":150},"Design System & Branding","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Fdesign-system","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F3.design-system","i-lucide-zap",{"title":153,"path":154,"stem":155,"children":156,"icon":159},"Fireskills","\u002Fdocs\u002Ffireskills","docs\u002F2.fireskills\u002F0.index",[157,160,219,249,275,293],{"title":158,"path":154,"stem":155,"icon":159},"What is Fireskills?","i-lucide-flame",{"title":20,"icon":21,"hide":22,"path":161,"stem":162,"children":163,"page":62},"\u002Fdocs\u002Ffireskills\u002Fgetting-started","docs\u002F2.fireskills\u002F1.getting-started",[164,167,171,175,179,183,187,191,195,199,203,207,211,215],{"title":27,"path":165,"stem":166},"\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fquick-start","docs\u002F2.fireskills\u002F1.getting-started\u002F00.quick-start",{"title":168,"path":169,"stem":170},"Workflow & Governance","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fworkflow","docs\u002F2.fireskills\u002F1.getting-started\u002F01.workflow",{"title":172,"path":173,"stem":174},"Project Context","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fproject-context","docs\u002F2.fireskills\u002F1.getting-started\u002F02.project-context",{"title":176,"path":177,"stem":178},"Step 0: Setup","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-setup","docs\u002F2.fireskills\u002F1.getting-started\u002F03.step-setup",{"title":180,"path":181,"stem":182},"Step 1: Inbox","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-inbox","docs\u002F2.fireskills\u002F1.getting-started\u002F04.step-inbox",{"title":184,"path":185,"stem":186},"Step 2: Backlog","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-backlog","docs\u002F2.fireskills\u002F1.getting-started\u002F05.step-backlog",{"title":188,"path":189,"stem":190},"Step 3: Specify","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-specify","docs\u002F2.fireskills\u002F1.getting-started\u002F06.step-specify",{"title":192,"path":193,"stem":194},"Step 4: Validate","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-validate","docs\u002F2.fireskills\u002F1.getting-started\u002F07.step-validate",{"title":196,"path":197,"stem":198},"Step 5: Tasks","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-tasks","docs\u002F2.fireskills\u002F1.getting-started\u002F08.step-tasks",{"title":200,"path":201,"stem":202},"Step 6: TDD\u002FBDD","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-tdd-bdd","docs\u002F2.fireskills\u002F1.getting-started\u002F09.step-tdd-bdd",{"title":204,"path":205,"stem":206},"Step 7: Implement","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-implement","docs\u002F2.fireskills\u002F1.getting-started\u002F10.step-implement",{"title":208,"path":209,"stem":210},"Step 8: Documentator","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-documentator","docs\u002F2.fireskills\u002F1.getting-started\u002F11.step-documentator",{"title":212,"path":213,"stem":214},"Late Changes","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Flate-changes","docs\u002F2.fireskills\u002F1.getting-started\u002F12.late-changes",{"title":216,"path":217,"stem":218},"Other Entry Points","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fother-entry-points","docs\u002F2.fireskills\u002F1.getting-started\u002F13.other-entry-points",{"title":220,"icon":221,"hide":22,"path":222,"stem":223,"children":224,"page":62},"Methodology","i-lucide-git-branch","\u002Fdocs\u002Ffireskills\u002Fmethodology","docs\u002F2.fireskills\u002F2.methodology",[225,229,233,237,241,245],{"title":226,"path":227,"stem":228},"The Three Acts","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fthree-acts","docs\u002F2.fireskills\u002F2.methodology\u002F0.three-acts",{"title":230,"path":231,"stem":232},"The Three Gates","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fthree-gates","docs\u002F2.fireskills\u002F2.methodology\u002F1.three-gates",{"title":234,"path":235,"stem":236},"The Canonical Spec","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fcanonical-spec","docs\u002F2.fireskills\u002F2.methodology\u002F2.canonical-spec",{"title":238,"path":239,"stem":240},"Lifecycle States","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Flifecycle-states","docs\u002F2.fireskills\u002F2.methodology\u002F3.lifecycle-states",{"title":242,"path":243,"stem":244},"Effort Scale","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Feffort-scale","docs\u002F2.fireskills\u002F2.methodology\u002F4.effort-scale",{"title":246,"path":247,"stem":248},"Milestones & Governance","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fgovernance-and-milestones","docs\u002F2.fireskills\u002F2.methodology\u002F5.governance-and-milestones",{"title":250,"icon":251,"hide":22,"path":252,"stem":253,"children":254,"page":62},"Skills","i-lucide-layers","\u002Fdocs\u002Ffireskills\u002Fskills","docs\u002F2.fireskills\u002F3.skills",[255,259,263,267,271],{"title":256,"path":257,"stem":258},"Catalog","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fcatalog","docs\u002F2.fireskills\u002F3.skills\u002F0.catalog",{"title":260,"path":261,"stem":262},"Act I: Define","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fact-1-define","docs\u002F2.fireskills\u002F3.skills\u002F1.act-1-define",{"title":264,"path":265,"stem":266},"Act II: Design & Prove","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fact-2-design-prove","docs\u002F2.fireskills\u002F3.skills\u002F2.act-2-design-prove",{"title":268,"path":269,"stem":270},"Act III: Deliver","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fact-3-deliver","docs\u002F2.fireskills\u002F3.skills\u002F3.act-3-deliver",{"title":272,"path":273,"stem":274},"Governance & Decisions","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fgovernance-and-decisions","docs\u002F2.fireskills\u002F3.skills\u002F4.governance-and-decisions",{"title":276,"icon":277,"hide":22,"path":278,"stem":279,"children":280,"page":62},"Specialists","i-lucide-sparkles","\u002Fdocs\u002Ffireskills\u002Fspecialists","docs\u002F2.fireskills\u002F4.specialists",[281,285,289],{"title":282,"path":283,"stem":284},"Overview","\u002Fdocs\u002Ffireskills\u002Fspecialists\u002Foverview","docs\u002F2.fireskills\u002F4.specialists\u002F0.overview",{"title":286,"path":287,"stem":288},"Nuxfire Stack","\u002Fdocs\u002Ffireskills\u002Fspecialists\u002Fnuxfire-stack","docs\u002F2.fireskills\u002F4.specialists\u002F1.nuxfire-stack",{"title":290,"path":291,"stem":292},"Engineering Specialists","\u002Fdocs\u002Ffireskills\u002Fspecialists\u002Fengineering-specialists","docs\u002F2.fireskills\u002F4.specialists\u002F2.engineering-specialists",{"title":294,"icon":295,"hide":22,"path":296,"stem":297,"children":298,"page":62},"CLI & Tooling","i-lucide-terminal","\u002Fdocs\u002Ffireskills\u002Fcli","docs\u002F2.fireskills\u002F5.cli",[299,303,307],{"title":300,"path":301,"stem":302},"CLI Overview","\u002Fdocs\u002Ffireskills\u002Fcli\u002Foverview","docs\u002F2.fireskills\u002F5.cli\u002F0.overview",{"title":304,"path":305,"stem":306},"Commands","\u002Fdocs\u002Ffireskills\u002Fcli\u002Fcommands","docs\u002F2.fireskills\u002F5.cli\u002F1.commands",{"title":308,"path":309,"stem":310},"Safety Scripts","\u002Fdocs\u002Ffireskills\u002Fcli\u002Fgovernance-scripts","docs\u002F2.fireskills\u002F5.cli\u002F2.governance-scripts",{"id":312,"title":313,"author":314,"authorType":315,"body":316,"category":325,"date":1157,"description":1158,"extension":1159,"image":1160,"lang":1161,"meta":1162,"navigation":22,"ogImage":1163,"path":1164,"readTime":1165,"seo":1166,"stem":1167,"tags":1168,"translations":1169,"updated":1168,"__hash__":1173},"blog\u002Fblog\u002Fprimeros-pasos-typescript-nuxt-4.md","Primeros Pasos con TypeScript en Nuxt 4: Guía Completa para SaaS","Adilson Noveli","Person",{"type":317,"value":318,"toc":1151},"minimark",[319,327,334,337,342,345,378,380,384,387,699,971,1121,1123,1127,1130,1132,1136,1139,1147],[320,321,322,326],"p",{},[323,324,325],"strong",{},"TypeScript"," se ha vuelto un requisito indispensable en el desarrollo de software moderno, especialmente en la construcción de aplicaciones SaaS críticas donde los errores en tiempo de ejecución cuestan clientes y reputación.",[320,328,329,330,333],{},"En el ecosistema de ",[323,331,332],{},"Nuxfire",", TypeScript no es solo un linter ni una comprobación superficial de tipos: es el cimiento fundamental que conecta la base de datos PostgreSQL con el cliente Vue 3, pasando por la capa de APIs con tRPC y por la infraestructura con SST v4.",[335,336],"hr",{},[338,339,341],"h2",{"id":340},"por-qué-el-tipado-estricto-es-crítico-en-saas","¿Por qué el Tipado Estricto es Crítico en SaaS?",[320,343,344],{},"Construir software escalable exige previsibilidad. Cuando varios desarrolladores (o asistentes de IA como Cursor y Claude Code) colaboran en el mismo código, el tipado estricto garantiza:",[346,347,348,355,366,372],"ol",{},[349,350,351,354],"li",{},[323,352,353],{},"Refactorizaciones sin Miedo",": Renombra campos en la base de datos o cambia firmas de funciones y el compilador señalará exactamente qué pantallas necesitan ajustes.",[349,356,357,360,361,365],{},[323,358,359],{},"Eliminación de Clases Enteras de Bugs",": ",[362,363,364],"code",{},"undefined is not a function"," y los accesos a propiedades inexistentes se interceptan antes del commit.",[349,367,368,371],{},[323,369,370],{},"Autocompletado Inteligente en el IDE",": Productividad multiplicada con sugerencias instantáneas de parámetros, retornos y tipos utilitarios.",[349,373,374,377],{},[323,375,376],{},"Alineación Perfecta con las Herramientas de IA",": Los LLM producen código sustancialmente mejor cuando los guían definiciones estrictas de interfaces.",[335,379],{},[338,381,383],{"id":382},"el-flujo-de-tipado-de-extremo-a-extremo-en-nuxfire","El Flujo de Tipado de Extremo a Extremo en Nuxfire",[320,385,386],{},"La arquitectura de Nuxfire implementa una cadena completa de inferencia de tipos en 3 capas:",[388,389,394],"pre",{"className":390,"code":391,"language":392,"meta":393,"style":393},"language-typescript shiki shiki-themes material-theme-lighter github-light github-dark monokai","\u002F\u002F 1. Schema de la Base de Datos (Drizzle ORM)\nexport const users = pgTable(\"users\", {\n  id: text(\"id\").primaryKey(),\n  email: text(\"email\").notNull().unique(),\n  role: text(\"role\", { enum: [\"owner\", \"admin\", \"member\"] }).notNull(),\n  createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n});\n\nexport type User = typeof users.$inferSelect;\nexport type NewUser = typeof users.$inferInsert;\n","typescript","",[362,395,396,405,449,486,523,597,634,644,650,676],{"__ignoreMap":393},[397,398,401],"span",{"class":399,"line":400},"line",1,[397,402,404],{"class":403},"ss7Ak","\u002F\u002F 1. Schema de la Base de Datos (Drizzle ORM)\n",[397,406,408,412,416,420,424,428,432,436,440,442,446],{"class":399,"line":407},2,[397,409,411],{"class":410},"sRxSC","export",[397,413,415],{"class":414},"srJo8"," const",[397,417,419],{"class":418},"s91G_"," users",[397,421,423],{"class":422},"sGXK2"," =",[397,425,427],{"class":426},"sD0ED"," pgTable",[397,429,431],{"class":430},"ss--_","(",[397,433,435],{"class":434},"siCPE","\"",[397,437,439],{"class":438},"sLACW","users",[397,441,435],{"class":434},[397,443,445],{"class":444},"swvn1",",",[397,447,448],{"class":444}," {\n",[397,450,452,456,459,462,464,466,469,471,474,477,480,483],{"class":399,"line":451},3,[397,453,455],{"class":454},"squCx","  id",[397,457,458],{"class":444},":",[397,460,461],{"class":426}," text",[397,463,431],{"class":430},[397,465,435],{"class":434},[397,467,468],{"class":438},"id",[397,470,435],{"class":434},[397,472,473],{"class":430},")",[397,475,476],{"class":444},".",[397,478,479],{"class":426},"primaryKey",[397,481,482],{"class":430},"()",[397,484,485],{"class":444},",\n",[397,487,489,492,494,496,498,500,503,505,507,509,512,514,516,519,521],{"class":399,"line":488},4,[397,490,491],{"class":454},"  email",[397,493,458],{"class":444},[397,495,461],{"class":426},[397,497,431],{"class":430},[397,499,435],{"class":434},[397,501,502],{"class":438},"email",[397,504,435],{"class":434},[397,506,473],{"class":430},[397,508,476],{"class":444},[397,510,511],{"class":426},"notNull",[397,513,482],{"class":430},[397,515,476],{"class":444},[397,517,518],{"class":426},"unique",[397,520,482],{"class":430},[397,522,485],{"class":444},[397,524,526,529,531,533,535,537,540,542,544,547,550,552,555,557,560,562,564,567,570,572,574,576,579,581,584,587,589,591,593,595],{"class":399,"line":525},5,[397,527,528],{"class":454},"  role",[397,530,458],{"class":444},[397,532,461],{"class":426},[397,534,431],{"class":430},[397,536,435],{"class":434},[397,538,539],{"class":438},"role",[397,541,435],{"class":434},[397,543,445],{"class":444},[397,545,546],{"class":444}," {",[397,548,549],{"class":454}," enum",[397,551,458],{"class":444},[397,553,554],{"class":430}," [",[397,556,435],{"class":434},[397,558,559],{"class":438},"owner",[397,561,435],{"class":434},[397,563,445],{"class":444},[397,565,566],{"class":434}," \"",[397,568,569],{"class":438},"admin",[397,571,435],{"class":434},[397,573,445],{"class":444},[397,575,566],{"class":434},[397,577,578],{"class":438},"member",[397,580,435],{"class":434},[397,582,583],{"class":430},"] ",[397,585,586],{"class":444},"}",[397,588,473],{"class":430},[397,590,476],{"class":444},[397,592,511],{"class":426},[397,594,482],{"class":430},[397,596,485],{"class":444},[397,598,600,603,605,608,610,612,615,617,619,621,624,626,628,630,632],{"class":399,"line":599},6,[397,601,602],{"class":454},"  createdAt",[397,604,458],{"class":444},[397,606,607],{"class":426}," timestamp",[397,609,431],{"class":430},[397,611,435],{"class":434},[397,613,614],{"class":438},"created_at",[397,616,435],{"class":434},[397,618,473],{"class":430},[397,620,476],{"class":444},[397,622,623],{"class":426},"defaultNow",[397,625,482],{"class":430},[397,627,476],{"class":444},[397,629,511],{"class":426},[397,631,482],{"class":430},[397,633,485],{"class":444},[397,635,637,639,641],{"class":399,"line":636},7,[397,638,586],{"class":444},[397,640,473],{"class":430},[397,642,643],{"class":444},";\n",[397,645,647],{"class":399,"line":646},8,[397,648,649],{"emptyLinePlaceholder":22},"\n",[397,651,653,655,658,662,664,667,669,671,674],{"class":399,"line":652},9,[397,654,411],{"class":410},[397,656,657],{"class":414}," type",[397,659,661],{"class":660},"sKvfc"," User",[397,663,423],{"class":422},[397,665,666],{"class":422}," typeof",[397,668,419],{"class":430},[397,670,476],{"class":444},[397,672,673],{"class":430},"$inferSelect",[397,675,643],{"class":444},[397,677,679,681,683,686,688,690,692,694,697],{"class":399,"line":678},10,[397,680,411],{"class":410},[397,682,657],{"class":414},[397,684,685],{"class":660}," NewUser",[397,687,423],{"class":422},[397,689,666],{"class":422},[397,691,419],{"class":430},[397,693,476],{"class":444},[397,695,696],{"class":430},"$inferInsert",[397,698,643],{"class":444},[388,700,702],{"className":390,"code":701,"language":392,"meta":393,"style":393},"\u002F\u002F 2. Procedimiento de API Tipado (tRPC v11)\nexport const usersRouter = router({\n  getProfile: protectedProcedure\n    .input(z.object({ userId: z.string() }))\n    .query(async ({ ctx, input }) => {\n      const user = await ctx.db.query.users.findFirst({\n        where: eq(users.id, input.userId),\n      });\n      if (!user) throw new TRPCError({ code: \"NOT_FOUND\" });\n      return user; \u002F\u002F ¡Tipo inferido automáticamente!\n    }),\n});\n",[362,703,704,709,728,738,780,813,850,881,890,939,952,962],{"__ignoreMap":393},[397,705,706],{"class":399,"line":400},[397,707,708],{"class":403},"\u002F\u002F 2. Procedimiento de API Tipado (tRPC v11)\n",[397,710,711,713,715,718,720,723,725],{"class":399,"line":407},[397,712,411],{"class":410},[397,714,415],{"class":414},[397,716,717],{"class":418}," usersRouter",[397,719,423],{"class":422},[397,721,722],{"class":426}," router",[397,724,431],{"class":430},[397,726,727],{"class":444},"{\n",[397,729,730,733,735],{"class":399,"line":451},[397,731,732],{"class":454},"  getProfile",[397,734,458],{"class":444},[397,736,737],{"class":430}," protectedProcedure\n",[397,739,740,743,746,749,751,754,756,759,762,764,767,769,772,775,777],{"class":399,"line":488},[397,741,742],{"class":444},"    .",[397,744,745],{"class":426},"input",[397,747,748],{"class":430},"(z",[397,750,476],{"class":444},[397,752,753],{"class":426},"object",[397,755,431],{"class":430},[397,757,758],{"class":444},"{",[397,760,761],{"class":454}," userId",[397,763,458],{"class":444},[397,765,766],{"class":430}," z",[397,768,476],{"class":444},[397,770,771],{"class":426},"string",[397,773,774],{"class":430},"() ",[397,776,586],{"class":444},[397,778,779],{"class":430},"))\n",[397,781,782,784,787,789,793,796,800,802,805,808,811],{"class":399,"line":525},[397,783,742],{"class":444},[397,785,786],{"class":426},"query",[397,788,431],{"class":430},[397,790,792],{"class":791},"sTNss","async",[397,794,795],{"class":444}," ({",[397,797,799],{"class":798},"sQgqH"," ctx",[397,801,445],{"class":444},[397,803,804],{"class":798}," input",[397,806,807],{"class":444}," })",[397,809,810],{"class":414}," =>",[397,812,448],{"class":444},[397,814,815,818,821,823,826,828,830,833,835,837,839,841,843,846,848],{"class":399,"line":599},[397,816,817],{"class":414},"      const",[397,819,820],{"class":418}," user",[397,822,423],{"class":422},[397,824,825],{"class":410}," await",[397,827,799],{"class":430},[397,829,476],{"class":444},[397,831,832],{"class":430},"db",[397,834,476],{"class":444},[397,836,786],{"class":430},[397,838,476],{"class":444},[397,840,439],{"class":430},[397,842,476],{"class":444},[397,844,845],{"class":426},"findFirst",[397,847,431],{"class":454},[397,849,727],{"class":444},[397,851,852,855,857,860,862,864,866,868,870,872,874,877,879],{"class":399,"line":636},[397,853,854],{"class":454},"        where",[397,856,458],{"class":444},[397,858,859],{"class":426}," eq",[397,861,431],{"class":454},[397,863,439],{"class":430},[397,865,476],{"class":444},[397,867,468],{"class":430},[397,869,445],{"class":444},[397,871,804],{"class":430},[397,873,476],{"class":444},[397,875,876],{"class":430},"userId",[397,878,473],{"class":454},[397,880,485],{"class":444},[397,882,883,886,888],{"class":399,"line":646},[397,884,885],{"class":444},"      }",[397,887,473],{"class":454},[397,889,643],{"class":444},[397,891,892,895,898,901,904,907,910,913,916,918,920,923,925,927,930,932,935,937],{"class":399,"line":652},[397,893,894],{"class":410},"      if",[397,896,897],{"class":454}," (",[397,899,900],{"class":422},"!",[397,902,903],{"class":430},"user",[397,905,906],{"class":454},") ",[397,908,909],{"class":410},"throw",[397,911,912],{"class":422}," new",[397,914,915],{"class":426}," TRPCError",[397,917,431],{"class":454},[397,919,758],{"class":444},[397,921,922],{"class":454}," code",[397,924,458],{"class":444},[397,926,566],{"class":434},[397,928,929],{"class":438},"NOT_FOUND",[397,931,435],{"class":434},[397,933,934],{"class":444}," }",[397,936,473],{"class":454},[397,938,643],{"class":444},[397,940,941,944,946,949],{"class":399,"line":678},[397,942,943],{"class":410},"      return",[397,945,820],{"class":430},[397,947,948],{"class":444},";",[397,950,951],{"class":403}," \u002F\u002F ¡Tipo inferido automáticamente!\n",[397,953,955,958,960],{"class":399,"line":954},11,[397,956,957],{"class":444},"    }",[397,959,473],{"class":430},[397,961,485],{"class":444},[397,963,965,967,969],{"class":399,"line":964},12,[397,966,586],{"class":444},[397,968,473],{"class":430},[397,970,643],{"class":444},[388,972,976],{"className":973,"code":974,"language":975,"meta":393,"style":393},"language-vue shiki shiki-themes material-theme-lighter github-light github-dark monokai","\u003C!-- 3. Consumo en el Frontend Vue \u002F Nuxt con Cero Generación de Código -->\n\u003Cscript setup lang=\"ts\">\nconst { $trpc } = useNuxtApp();\nconst { data: profile, status } = await $trpc.users.getProfile.useQuery({\n  userId: \"usr_123\",\n});\n\n\u002F\u002F ¡profile.value.email tiene inferencia total y autocompletado!\n\u003C\u002Fscript>\n","vue",[362,977,978,983,1012,1033,1079,1095,1103,1107,1112],{"__ignoreMap":393},[397,979,980],{"class":399,"line":400},[397,981,982],{"class":403},"\u003C!-- 3. Consumo en el Frontend Vue \u002F Nuxt con Cero Generación de Código -->\n",[397,984,985,988,992,996,999,1002,1004,1007,1009],{"class":399,"line":407},[397,986,987],{"class":444},"\u003C",[397,989,991],{"class":990},"sHsBP","script",[397,993,995],{"class":994},"s_lYk"," setup",[397,997,998],{"class":994}," lang",[397,1000,1001],{"class":444},"=",[397,1003,435],{"class":434},[397,1005,1006],{"class":438},"ts",[397,1008,435],{"class":434},[397,1010,1011],{"class":444},">\n",[397,1013,1014,1017,1019,1022,1024,1026,1029,1031],{"class":399,"line":451},[397,1015,1016],{"class":414},"const",[397,1018,546],{"class":444},[397,1020,1021],{"class":418}," $trpc",[397,1023,934],{"class":444},[397,1025,423],{"class":422},[397,1027,1028],{"class":426}," useNuxtApp",[397,1030,482],{"class":430},[397,1032,643],{"class":444},[397,1034,1035,1037,1039,1043,1045,1048,1050,1053,1055,1057,1059,1061,1063,1065,1067,1070,1072,1075,1077],{"class":399,"line":488},[397,1036,1016],{"class":414},[397,1038,546],{"class":444},[397,1040,1042],{"class":1041},"sIDdj"," data",[397,1044,458],{"class":444},[397,1046,1047],{"class":418}," profile",[397,1049,445],{"class":444},[397,1051,1052],{"class":418}," status",[397,1054,934],{"class":444},[397,1056,423],{"class":422},[397,1058,825],{"class":410},[397,1060,1021],{"class":430},[397,1062,476],{"class":444},[397,1064,439],{"class":430},[397,1066,476],{"class":444},[397,1068,1069],{"class":430},"getProfile",[397,1071,476],{"class":444},[397,1073,1074],{"class":426},"useQuery",[397,1076,431],{"class":430},[397,1078,727],{"class":444},[397,1080,1081,1084,1086,1088,1091,1093],{"class":399,"line":525},[397,1082,1083],{"class":454},"  userId",[397,1085,458],{"class":444},[397,1087,566],{"class":434},[397,1089,1090],{"class":438},"usr_123",[397,1092,435],{"class":434},[397,1094,485],{"class":444},[397,1096,1097,1099,1101],{"class":399,"line":599},[397,1098,586],{"class":444},[397,1100,473],{"class":430},[397,1102,643],{"class":444},[397,1104,1105],{"class":399,"line":636},[397,1106,649],{"emptyLinePlaceholder":22},[397,1108,1109],{"class":399,"line":646},[397,1110,1111],{"class":403},"\u002F\u002F ¡profile.value.email tiene inferencia total y autocompletado!\n",[397,1113,1114,1117,1119],{"class":399,"line":652},[397,1115,1116],{"class":444},"\u003C\u002F",[397,1118,991],{"class":990},[397,1120,1011],{"class":444},[335,1122],{},[338,1124,1126],{"id":1125},"beneficios-prácticos-para-el-vibe-coding-y-la-ia","Beneficios Prácticos para el Vibe Coding y la IA",[320,1128,1129],{},"Al desarrollar con Cursor, GitHub Copilot o Claude Code, las definiciones de tipos funcionan como el \"prompt de contexto\" más potente posible. El agente de IA no necesita adivinar el formato de las respuestas HTTP ni inventar nombres de tablas: los tipos de TypeScript guían la generación del código correcto al primer intento.",[335,1131],{},[338,1133,1135],{"id":1134},"conclusión","Conclusión",[320,1137,1138],{},"Adoptar TypeScript desde el día cero en tu SaaS ahorra semanas de depuración y hace posible un crecimiento sostenible de la base de código.",[320,1140,1141,1142,1146],{},"Si quieres saltarte la configuración manual de TypeScript, tRPC, Drizzle y Nuxt Layers y empezar directamente con una arquitectura de nivel enterprise lista para producción, conoce ",[1143,1144,332],"a",{"href":1145},"\u002Fes#pricing"," y obtén acceso inmediato al código fuente completo.",[1148,1149,1150],"style",{},"html pre.shiki code .ss7Ak, html code.shiki .ss7Ak{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit;--shiki-sepia:#88846F;--shiki-sepia-font-style:inherit}html pre.shiki code .sRxSC, html code.shiki .sRxSC{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#F92672;--shiki-sepia-font-style:inherit}html pre.shiki code .srJo8, html code.shiki .srJo8{--shiki-light:#9C3EDA;--shiki-light-font-style:inherit;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .s91G_, html code.shiki .s91G_{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#F8F8F2}html pre.shiki code .sGXK2, html code.shiki .sGXK2{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sD0ED, html code.shiki .sD0ED{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .ss--_, html code.shiki .ss--_{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .siCPE, html code.shiki .siCPE{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sLACW, html code.shiki .sLACW{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .swvn1, html code.shiki .swvn1{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .squCx, html code.shiki .squCx{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sKvfc, html code.shiki .sKvfc{--shiki-light:#E2931D;--shiki-light-text-decoration:inherit;--shiki-default:#6F42C1;--shiki-default-text-decoration:inherit;--shiki-dark:#B392F0;--shiki-dark-text-decoration:inherit;--shiki-sepia:#A6E22E;--shiki-sepia-text-decoration:underline}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .sTNss, html code.shiki .sTNss{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sQgqH, html code.shiki .sQgqH{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit;--shiki-sepia:#FD971F;--shiki-sepia-font-style:italic}html pre.shiki code .sHsBP, html code.shiki .sHsBP{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D;--shiki-sepia:#F92672}html pre.shiki code .s_lYk, html code.shiki .s_lYk{--shiki-light:#9C3EDA;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sIDdj, html code.shiki .sIDdj{--shiki-light:#E53935;--shiki-default:#E36209;--shiki-dark:#FFAB70;--shiki-sepia:#F8F8F2}",{"title":393,"searchDepth":407,"depth":407,"links":1152},[1153,1154,1155,1156],{"id":340,"depth":407,"text":341},{"id":382,"depth":407,"text":383},{"id":1125,"depth":407,"text":1126},{"id":1134,"depth":407,"text":1135},"2026-09-15","Aprende las mejores prácticas de TypeScript con tipado estricto de extremo a extremo, tRPC y Drizzle ORM en Nuxt 4 para acelerar el desarrollo de tu SaaS.","md","\u002Fimages\u002Fblog\u002Ftypescript-end-to-end-typesafety-es.svg","es",{},"\u002Fimages\u002Fblog\u002Ftypescript-end-to-end-typesafety-es.png","\u002Fblog\u002Fprimeros-pasos-typescript-nuxt-4","5 min",{"title":313,"description":1158},"blog\u002Fprimeros-pasos-typescript-nuxt-4",null,{"en":1170,"pt-br":1171,"es":1172},"typescript-nuxt-4-getting-started-guide","getting-started-with-typescript","primeros-pasos-typescript-nuxt-4","UwDHkR9L6R_xfE97Oe19b6wg4htp3UT73joOlpKzjgI",1790707503255]