[{"data":1,"prerenderedAt":1175},["ShallowReactive",2],{"navigation:en":3,"\u002Fblog\u002Fgetting-started-with-typescript":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":326,"date":1158,"description":1159,"extension":1160,"image":1161,"lang":1162,"meta":1163,"navigation":22,"ogImage":1164,"path":1165,"readTime":1166,"seo":1167,"stem":1168,"tags":1169,"translations":1170,"updated":1169,"__hash__":1174},"blog\u002Fblog\u002Fgetting-started-with-typescript.md","Primeiros Passos com TypeScript no Nuxt 4: Guia Completo para SaaS","Adilson Noveli","Person",{"type":317,"value":318,"toc":1152},"minimark",[319,328,335,338,343,346,379,381,385,388,700,972,1122,1124,1128,1131,1133,1137,1140,1148],[320,321,322,323,327],"p",{},"O ",[324,325,326],"strong",{},"TypeScript"," tornou-se um requisito indispensável no desenvolvimento moderno de software, especialmente na construção de aplicações SaaS críticas onde erros em tempo de execução custam clientes e reputação.",[320,329,330,331,334],{},"No ecossistema do ",[324,332,333],{},"Nuxfire",", o TypeScript não é apenas um linter ou uma checagem superficial de tipos: ele atua como o alicerce fundamental que conecta o banco de dados PostgreSQL ao cliente Vue 3, passando pela camada de APIs com tRPC e pela infraestrutura com SST v4.",[336,337],"hr",{},[339,340,342],"h2",{"id":341},"por-que-tipagem-estrita-é-crítica-em-saas","Por que Tipagem Estrita é Crítica em SaaS?",[320,344,345],{},"Construir um software escalável exige previsibilidade. Quando múltiplos desenvolvedores (ou assistentes de IA como Cursor e Claude Code) colaboram no mesmo código, a tipagem estrita garante:",[347,348,349,356,367,373],"ol",{},[350,351,352,355],"li",{},[324,353,354],{},"Refatorações sem Medo",": Renomeie campos no banco ou mude assinaturas de funções e o compilador apontará exatamente quais telas precisam de ajuste.",[350,357,358,361,362,366],{},[324,359,360],{},"Eliminação de Classes Inteiras de Bugs",": ",[363,364,365],"code",{},"undefined is not a function"," e acessos a propriedades inexistentes são interceptados antes do commit.",[350,368,369,372],{},[324,370,371],{},"Autocompletação Inteligente na IDE",": Produtividade multiplicada com sugestão instantânea de parâmetros, retornos e tipos utilitários.",[350,374,375,378],{},[324,376,377],{},"Alinhamento Perfeito com Ferramentas de IA",": LLMs produzem código substancialmente melhor quando guiados por definições estritas de interfaces.",[336,380],{},[339,382,384],{"id":383},"o-fluxo-de-tipagem-ponta-a-ponta-no-nuxfire","O Fluxo de Tipagem Ponta a Ponta no Nuxfire",[320,386,387],{},"A arquitetura do Nuxfire implementa uma esteira completa de inferência de tipos em 3 camadas:",[389,390,395],"pre",{"className":391,"code":392,"language":393,"meta":394,"style":394},"language-typescript shiki shiki-themes material-theme-lighter github-light github-dark monokai","\u002F\u002F 1. Schema do Banco de Dados (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","",[363,396,397,406,450,487,524,598,635,645,651,677],{"__ignoreMap":394},[398,399,402],"span",{"class":400,"line":401},"line",1,[398,403,405],{"class":404},"ss7Ak","\u002F\u002F 1. Schema do Banco de Dados (Drizzle ORM)\n",[398,407,409,413,417,421,425,429,433,437,441,443,447],{"class":400,"line":408},2,[398,410,412],{"class":411},"sRxSC","export",[398,414,416],{"class":415},"srJo8"," const",[398,418,420],{"class":419},"s91G_"," users",[398,422,424],{"class":423},"sGXK2"," =",[398,426,428],{"class":427},"sD0ED"," pgTable",[398,430,432],{"class":431},"ss--_","(",[398,434,436],{"class":435},"siCPE","\"",[398,438,440],{"class":439},"sLACW","users",[398,442,436],{"class":435},[398,444,446],{"class":445},"swvn1",",",[398,448,449],{"class":445}," {\n",[398,451,453,457,460,463,465,467,470,472,475,478,481,484],{"class":400,"line":452},3,[398,454,456],{"class":455},"squCx","  id",[398,458,459],{"class":445},":",[398,461,462],{"class":427}," text",[398,464,432],{"class":431},[398,466,436],{"class":435},[398,468,469],{"class":439},"id",[398,471,436],{"class":435},[398,473,474],{"class":431},")",[398,476,477],{"class":445},".",[398,479,480],{"class":427},"primaryKey",[398,482,483],{"class":431},"()",[398,485,486],{"class":445},",\n",[398,488,490,493,495,497,499,501,504,506,508,510,513,515,517,520,522],{"class":400,"line":489},4,[398,491,492],{"class":455},"  email",[398,494,459],{"class":445},[398,496,462],{"class":427},[398,498,432],{"class":431},[398,500,436],{"class":435},[398,502,503],{"class":439},"email",[398,505,436],{"class":435},[398,507,474],{"class":431},[398,509,477],{"class":445},[398,511,512],{"class":427},"notNull",[398,514,483],{"class":431},[398,516,477],{"class":445},[398,518,519],{"class":427},"unique",[398,521,483],{"class":431},[398,523,486],{"class":445},[398,525,527,530,532,534,536,538,541,543,545,548,551,553,556,558,561,563,565,568,571,573,575,577,580,582,585,588,590,592,594,596],{"class":400,"line":526},5,[398,528,529],{"class":455},"  role",[398,531,459],{"class":445},[398,533,462],{"class":427},[398,535,432],{"class":431},[398,537,436],{"class":435},[398,539,540],{"class":439},"role",[398,542,436],{"class":435},[398,544,446],{"class":445},[398,546,547],{"class":445}," {",[398,549,550],{"class":455}," enum",[398,552,459],{"class":445},[398,554,555],{"class":431}," [",[398,557,436],{"class":435},[398,559,560],{"class":439},"owner",[398,562,436],{"class":435},[398,564,446],{"class":445},[398,566,567],{"class":435}," \"",[398,569,570],{"class":439},"admin",[398,572,436],{"class":435},[398,574,446],{"class":445},[398,576,567],{"class":435},[398,578,579],{"class":439},"member",[398,581,436],{"class":435},[398,583,584],{"class":431},"] ",[398,586,587],{"class":445},"}",[398,589,474],{"class":431},[398,591,477],{"class":445},[398,593,512],{"class":427},[398,595,483],{"class":431},[398,597,486],{"class":445},[398,599,601,604,606,609,611,613,616,618,620,622,625,627,629,631,633],{"class":400,"line":600},6,[398,602,603],{"class":455},"  createdAt",[398,605,459],{"class":445},[398,607,608],{"class":427}," timestamp",[398,610,432],{"class":431},[398,612,436],{"class":435},[398,614,615],{"class":439},"created_at",[398,617,436],{"class":435},[398,619,474],{"class":431},[398,621,477],{"class":445},[398,623,624],{"class":427},"defaultNow",[398,626,483],{"class":431},[398,628,477],{"class":445},[398,630,512],{"class":427},[398,632,483],{"class":431},[398,634,486],{"class":445},[398,636,638,640,642],{"class":400,"line":637},7,[398,639,587],{"class":445},[398,641,474],{"class":431},[398,643,644],{"class":445},";\n",[398,646,648],{"class":400,"line":647},8,[398,649,650],{"emptyLinePlaceholder":22},"\n",[398,652,654,656,659,663,665,668,670,672,675],{"class":400,"line":653},9,[398,655,412],{"class":411},[398,657,658],{"class":415}," type",[398,660,662],{"class":661},"sKvfc"," User",[398,664,424],{"class":423},[398,666,667],{"class":423}," typeof",[398,669,420],{"class":431},[398,671,477],{"class":445},[398,673,674],{"class":431},"$inferSelect",[398,676,644],{"class":445},[398,678,680,682,684,687,689,691,693,695,698],{"class":400,"line":679},10,[398,681,412],{"class":411},[398,683,658],{"class":415},[398,685,686],{"class":661}," NewUser",[398,688,424],{"class":423},[398,690,667],{"class":423},[398,692,420],{"class":431},[398,694,477],{"class":445},[398,696,697],{"class":431},"$inferInsert",[398,699,644],{"class":445},[389,701,703],{"className":391,"code":702,"language":393,"meta":394,"style":394},"\u002F\u002F 2. Procedimento 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 automaticamente!\n    }),\n});\n",[363,704,705,710,729,739,781,814,851,882,891,940,953,963],{"__ignoreMap":394},[398,706,707],{"class":400,"line":401},[398,708,709],{"class":404},"\u002F\u002F 2. Procedimento de API Tipado (tRPC v11)\n",[398,711,712,714,716,719,721,724,726],{"class":400,"line":408},[398,713,412],{"class":411},[398,715,416],{"class":415},[398,717,718],{"class":419}," usersRouter",[398,720,424],{"class":423},[398,722,723],{"class":427}," router",[398,725,432],{"class":431},[398,727,728],{"class":445},"{\n",[398,730,731,734,736],{"class":400,"line":452},[398,732,733],{"class":455},"  getProfile",[398,735,459],{"class":445},[398,737,738],{"class":431}," protectedProcedure\n",[398,740,741,744,747,750,752,755,757,760,763,765,768,770,773,776,778],{"class":400,"line":489},[398,742,743],{"class":445},"    .",[398,745,746],{"class":427},"input",[398,748,749],{"class":431},"(z",[398,751,477],{"class":445},[398,753,754],{"class":427},"object",[398,756,432],{"class":431},[398,758,759],{"class":445},"{",[398,761,762],{"class":455}," userId",[398,764,459],{"class":445},[398,766,767],{"class":431}," z",[398,769,477],{"class":445},[398,771,772],{"class":427},"string",[398,774,775],{"class":431},"() ",[398,777,587],{"class":445},[398,779,780],{"class":431},"))\n",[398,782,783,785,788,790,794,797,801,803,806,809,812],{"class":400,"line":526},[398,784,743],{"class":445},[398,786,787],{"class":427},"query",[398,789,432],{"class":431},[398,791,793],{"class":792},"sTNss","async",[398,795,796],{"class":445}," ({",[398,798,800],{"class":799},"sQgqH"," ctx",[398,802,446],{"class":445},[398,804,805],{"class":799}," input",[398,807,808],{"class":445}," })",[398,810,811],{"class":415}," =>",[398,813,449],{"class":445},[398,815,816,819,822,824,827,829,831,834,836,838,840,842,844,847,849],{"class":400,"line":600},[398,817,818],{"class":415},"      const",[398,820,821],{"class":419}," user",[398,823,424],{"class":423},[398,825,826],{"class":411}," await",[398,828,800],{"class":431},[398,830,477],{"class":445},[398,832,833],{"class":431},"db",[398,835,477],{"class":445},[398,837,787],{"class":431},[398,839,477],{"class":445},[398,841,440],{"class":431},[398,843,477],{"class":445},[398,845,846],{"class":427},"findFirst",[398,848,432],{"class":455},[398,850,728],{"class":445},[398,852,853,856,858,861,863,865,867,869,871,873,875,878,880],{"class":400,"line":637},[398,854,855],{"class":455},"        where",[398,857,459],{"class":445},[398,859,860],{"class":427}," eq",[398,862,432],{"class":455},[398,864,440],{"class":431},[398,866,477],{"class":445},[398,868,469],{"class":431},[398,870,446],{"class":445},[398,872,805],{"class":431},[398,874,477],{"class":445},[398,876,877],{"class":431},"userId",[398,879,474],{"class":455},[398,881,486],{"class":445},[398,883,884,887,889],{"class":400,"line":647},[398,885,886],{"class":445},"      }",[398,888,474],{"class":455},[398,890,644],{"class":445},[398,892,893,896,899,902,905,908,911,914,917,919,921,924,926,928,931,933,936,938],{"class":400,"line":653},[398,894,895],{"class":411},"      if",[398,897,898],{"class":455}," (",[398,900,901],{"class":423},"!",[398,903,904],{"class":431},"user",[398,906,907],{"class":455},") ",[398,909,910],{"class":411},"throw",[398,912,913],{"class":423}," new",[398,915,916],{"class":427}," TRPCError",[398,918,432],{"class":455},[398,920,759],{"class":445},[398,922,923],{"class":455}," code",[398,925,459],{"class":445},[398,927,567],{"class":435},[398,929,930],{"class":439},"NOT_FOUND",[398,932,436],{"class":435},[398,934,935],{"class":445}," }",[398,937,474],{"class":455},[398,939,644],{"class":445},[398,941,942,945,947,950],{"class":400,"line":679},[398,943,944],{"class":411},"      return",[398,946,821],{"class":431},[398,948,949],{"class":445},";",[398,951,952],{"class":404}," \u002F\u002F Tipo inferido automaticamente!\n",[398,954,956,959,961],{"class":400,"line":955},11,[398,957,958],{"class":445},"    }",[398,960,474],{"class":431},[398,962,486],{"class":445},[398,964,966,968,970],{"class":400,"line":965},12,[398,967,587],{"class":445},[398,969,474],{"class":431},[398,971,644],{"class":445},[389,973,977],{"className":974,"code":975,"language":976,"meta":394,"style":394},"language-vue shiki shiki-themes material-theme-lighter github-light github-dark monokai","\u003C!-- 3. Consumo no Frontend Vue \u002F Nuxt com Zero Geração 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 possui inferência total e autocompletion!\n\u003C\u002Fscript>\n","vue",[363,978,979,984,1013,1034,1080,1096,1104,1108,1113],{"__ignoreMap":394},[398,980,981],{"class":400,"line":401},[398,982,983],{"class":404},"\u003C!-- 3. Consumo no Frontend Vue \u002F Nuxt com Zero Geração de Código -->\n",[398,985,986,989,993,997,1000,1003,1005,1008,1010],{"class":400,"line":408},[398,987,988],{"class":445},"\u003C",[398,990,992],{"class":991},"sHsBP","script",[398,994,996],{"class":995},"s_lYk"," setup",[398,998,999],{"class":995}," lang",[398,1001,1002],{"class":445},"=",[398,1004,436],{"class":435},[398,1006,1007],{"class":439},"ts",[398,1009,436],{"class":435},[398,1011,1012],{"class":445},">\n",[398,1014,1015,1018,1020,1023,1025,1027,1030,1032],{"class":400,"line":452},[398,1016,1017],{"class":415},"const",[398,1019,547],{"class":445},[398,1021,1022],{"class":419}," $trpc",[398,1024,935],{"class":445},[398,1026,424],{"class":423},[398,1028,1029],{"class":427}," useNuxtApp",[398,1031,483],{"class":431},[398,1033,644],{"class":445},[398,1035,1036,1038,1040,1044,1046,1049,1051,1054,1056,1058,1060,1062,1064,1066,1068,1071,1073,1076,1078],{"class":400,"line":489},[398,1037,1017],{"class":415},[398,1039,547],{"class":445},[398,1041,1043],{"class":1042},"sIDdj"," data",[398,1045,459],{"class":445},[398,1047,1048],{"class":419}," profile",[398,1050,446],{"class":445},[398,1052,1053],{"class":419}," status",[398,1055,935],{"class":445},[398,1057,424],{"class":423},[398,1059,826],{"class":411},[398,1061,1022],{"class":431},[398,1063,477],{"class":445},[398,1065,440],{"class":431},[398,1067,477],{"class":445},[398,1069,1070],{"class":431},"getProfile",[398,1072,477],{"class":445},[398,1074,1075],{"class":427},"useQuery",[398,1077,432],{"class":431},[398,1079,728],{"class":445},[398,1081,1082,1085,1087,1089,1092,1094],{"class":400,"line":526},[398,1083,1084],{"class":455},"  userId",[398,1086,459],{"class":445},[398,1088,567],{"class":435},[398,1090,1091],{"class":439},"usr_123",[398,1093,436],{"class":435},[398,1095,486],{"class":445},[398,1097,1098,1100,1102],{"class":400,"line":600},[398,1099,587],{"class":445},[398,1101,474],{"class":431},[398,1103,644],{"class":445},[398,1105,1106],{"class":400,"line":637},[398,1107,650],{"emptyLinePlaceholder":22},[398,1109,1110],{"class":400,"line":647},[398,1111,1112],{"class":404},"\u002F\u002F profile.value.email possui inferência total e autocompletion!\n",[398,1114,1115,1118,1120],{"class":400,"line":653},[398,1116,1117],{"class":445},"\u003C\u002F",[398,1119,992],{"class":991},[398,1121,1012],{"class":445},[336,1123],{},[339,1125,1127],{"id":1126},"benefícios-práticos-para-vibe-coding-e-ia","Benefícios Práticos para Vibe Coding e IA",[320,1129,1130],{},"Ao desenvolver com Cursor, GitHub Copilot ou Claude Code, as definições de tipo funcionam como o \"prompt de contexto\" mais poderoso possível. O agente de IA não precisa adivinhar o formato das respostas HTTP nem inventar nomes de tabelas: os tipos TypeScript orientam a geração do código correto na primeira tentativa.",[336,1132],{},[339,1134,1136],{"id":1135},"conclusão","Conclusão",[320,1138,1139],{},"Adotar TypeScript desde o dia zero no seu SaaS economiza semanas de depuração e viabiliza um crescimento sustentável da base de código.",[320,1141,1142,1143,1147],{},"Se você quer pular a configuração manual de TypeScript, tRPC, Drizzle e Nuxt Layers e começar diretamente com uma arquitetura de nível enterprise pronta para produção, conheça o ",[1144,1145,333],"a",{"href":1146},"\u002Fpt-br#pricing"," e garanta acesso imediato ao código-fonte completo.",[1149,1150,1151],"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":394,"searchDepth":408,"depth":408,"links":1153},[1154,1155,1156,1157],{"id":341,"depth":408,"text":342},{"id":383,"depth":408,"text":384},{"id":1126,"depth":408,"text":1127},{"id":1135,"depth":408,"text":1136},"2026-09-15","Aprenda as melhores práticas de TypeScript com tipagem estrita de ponta a ponta, tRPC e Drizzle ORM no Nuxt 4 para acelerar o desenvolvimento do seu SaaS.","md","\u002Fimages\u002Fblog\u002Ftypescript-end-to-end-typesafety.svg","pt-br",{},"\u002Fimages\u002Fblog\u002Ftypescript-end-to-end-typesafety.png","\u002Fblog\u002Fgetting-started-with-typescript","5 min",{"title":313,"description":1159},"blog\u002Fgetting-started-with-typescript",null,{"en":1171,"pt-br":1172,"es":1173},"typescript-nuxt-4-getting-started-guide","getting-started-with-typescript","primeros-pasos-typescript-nuxt-4","GfHt7MR66Aj6hc3T_RabFSDB2t3kh7ty563FDsAI4VM",1790707502150]