[{"data":1,"prerenderedAt":2272},["ShallowReactive",2],{"i-mdi:close":3,"i-bx:menu":8,"i-ph:translate":10,"i-flag:br-4x3":13,"i-flag:us-4x3":17,"post-zod-why-how-when":19},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cpath fill=\"currentColor\" d=\"M19 6.41L17.59 5L12 10.59L6.41 5L5 6.41L10.59 12L5 17.59L6.41 19L12 13.41L17.59 19L19 17.59L13.41 12z\"/>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\u003Cpath fill=\"currentColor\" d=\"M4 6h16v2H4zm0 5h16v2H4zm0 5h16v2H4z\"/>",{"left":4,"top":4,"width":11,"height":11,"rotate":4,"vFlip":6,"hFlip":6,"body":12},256,"\u003Cpath fill=\"currentColor\" d=\"m247.15 212.42l-56-112a8 8 0 0 0-14.31 0l-21.71 43.43A88 88 0 0 1 108 126.93A103.65 103.65 0 0 0 135.69 64H160a8 8 0 0 0 0-16h-56V32a8 8 0 0 0-16 0v16H32a8 8 0 0 0 0 16h87.63A87.76 87.76 0 0 1 96 116.35a87.7 87.7 0 0 1-19-31a8 8 0 1 0-15.08 5.34A103.6 103.6 0 0 0 84 127a87.55 87.55 0 0 1-52 17a8 8 0 0 0 0 16a103.46 103.46 0 0 0 64-22.08a104.2 104.2 0 0 0 51.44 21.31l-26.6 53.19a8 8 0 0 0 14.31 7.16L148.94 192h70.11l13.79 27.58A8 8 0 0 0 240 224a8 8 0 0 0 7.15-11.58M156.94 176L184 121.89L211.05 176Z\"/>",{"left":4,"top":4,"width":14,"height":15,"rotate":4,"vFlip":6,"hFlip":6,"body":16},640,480,"\u003Cg stroke-width=\"1pt\">\u003Cpath fill=\"#229e45\" fill-rule=\"evenodd\" d=\"M0 0h640v480H0z\"/>\u003Cpath fill=\"#f8e509\" fill-rule=\"evenodd\" d=\"m321.4 436l301.5-195.7L319.6 44L17.1 240.7z\"/>\u003Cpath fill=\"#2b49a3\" fill-rule=\"evenodd\" d=\"M452.8 240c0 70.3-57.1 127.3-127.6 127.3A127.4 127.4 0 1 1 452.8 240\"/>\u003Cpath fill=\"#ffffef\" fill-rule=\"evenodd\" d=\"m283.3 316.3l-4-2.3l-4 2l.9-4.5l-3.2-3.4l4.5-.5l2.2-4l1.9 4.2l4.4.8l-3.3 3m86 26.3l-3.9-2.3l-4 2l.8-4.5l-3.1-3.3l4.5-.5l2.1-4.1l2 4.2l4.4.8l-3.4 3.1m-36.2-30l-3.4-2l-3.5 1.8l.8-3.9l-2.8-2.9l4-.4l1.8-3.6l1.6 3.7l3.9.7l-3 2.7m87-8.5l-3.4-2l-3.5 1.8l.8-3.9l-2.7-2.8l3.9-.4l1.8-3.5l1.6 3.6l3.8.7l-2.9 2.6m-87.3-22l-4-2.2l-4 2l.8-4.6l-3.1-3.3l4.5-.5l2.1-4.1l2 4.2l4.4.8l-3.4 3.2m-104.6-35l-4-2.2l-4 2l1-4.6l-3.3-3.3l4.6-.5l2-4.1l2 4.2l4.4.8l-3.3 3.1m13.3 57.2l-4-2.3l-4 2l.9-4.5l-3.2-3.3l4.5-.6l2.1-4l2 4.2l4.4.8l-3.3 3.1m132-67.3l-3.6-2l-3.6 1.8l.8-4l-2.8-3l4-.5l1.9-3.6l1.7 3.8l4 .7l-3 2.7m-6.7 38.3l-2.7-1.6l-2.9 1.4l.6-3.2l-2.2-2.3l3.2-.4l1.5-2.8l1.3 3l3 .5l-2.2 2.2m-142.2 50.4l-2.7-1.5l-2.7 1.3l.6-3l-2.1-2.2l3-.4l1.4-2.7l1.3 2.8l3 .6l-2.3 2M419 299.8l-2.2-1.1l-2.2 1l.5-2.3l-1.7-1.6l2.4-.3l1.2-2l1 2l2.5.5l-1.9 1.5\"/>\u003Cpath fill=\"#ffffef\" fill-rule=\"evenodd\" d=\"m219.3 287.6l-2.7-1.5l-2.7 1.3l.6-3l-2.1-2.2l3-.4l1.4-2.7l1.3 2.8l3 .6l-2.3 2\"/>\u003Cpath fill=\"#ffffef\" fill-rule=\"evenodd\" d=\"m219.3 287.6l-2.7-1.5l-2.7 1.3l.6-3l-2.1-2.2l3-.4l1.4-2.7l1.3 2.8l3 .6l-2.3 2m42.3 3l-2.6-1.4l-2.7 1.3l.6-3l-2.1-2.2l3-.4l1.4-2.7l1.3 2.8l3 .5l-2.3 2.1m-4.8 17l-2.6-1.5l-2.7 1.4l.6-3l-2.1-2.3l3-.4l1.4-2.7l1.3 2.8l3 .6l-2.3 2m87.4-22.2l-2.6-1.6l-2.8 1.4l.6-3l-2-2.3l3-.3l1.4-2.7l1.2 2.8l3 .5l-2.2 2.1m-25.1 3l-2.7-1.5l-2.7 1.4l.6-3l-2-2.3l3-.3l1.4-2.8l1.2 2.9l3 .5l-2.2 2.1m-68.8-5.8l-1.7-1l-1.7.8l.4-1.9l-1.3-1.4l1.9-.2l.8-1.7l.8 1.8l1.9.3l-1.4 1.3m167.8 45.4l-2.6-1.5l-2.7 1.4l.6-3l-2.1-2.3l3-.4l1.4-2.7l1.3 2.8l3 .6l-2.3 2m-20.8 6l-2.2-1.4l-2.3 1.2l.5-2.6l-1.7-1.8l2.5-.3l1.2-2.3l1 2.4l2.5.4l-1.9 1.8m10.4 2.3l-2-1.2l-2.1 1l.4-2.3l-1.6-1.7l2.3-.3l1.1-2l1 2l2.3.5l-1.7 1.6m29.1-22.8l-2-1l-2 1l.5-2.3l-1.6-1.7l2.3-.3l1-2l1 2.1l2.1.4l-1.6 1.6m-38.8 41.8l-2.5-1.4l-2.7 1.2l.6-2.8l-2-2l3-.3l1.3-2.5l1.2 2.6l3 .5l-2.3 1.9m.6 14.2l-2.4-1.4l-2.4 1.3l.6-2.8l-1.9-2l2.7-.4l1.2-2.5l1.1 2.6l2.7.5l-2 2m-19-23.1l-1.9-1.2l-2 1l.4-2.2l-1.5-1.7l2.2-.2l1-2l1 2l2.2.4l-1.6 1.6m-17.8 2.3l-2-1.2l-2 1l.5-2.2l-1.6-1.7l2.3-.2l1-2l1 2l2.1.4l-1.6 1.6m-30.4-24.6l-2-1.1l-2 1l.5-2.3l-1.6-1.6l2.2-.3l1-2l1 2l2.2.5l-1.6 1.5m3.7 57l-1.6-.9l-1.8.9l.4-2l-1.3-1.4l1.9-.2l.9-1.7l.8 1.8l1.9.3l-1.4 1.3m-46.2-86.6l-4-2.3l-4 2l.9-4.5l-3.2-3.3l4.5-.6l2.2-4l1.9 4.2l4.4.8l-3.3 3.1\"/>\u003Cpath fill=\"#fff\" fill-rule=\"evenodd\" d=\"M444.4 285.8a125 125 0 0 0 5.8-19.8c-67.8-59.5-143.3-90-238.7-83.7a125 125 0 0 0-8.5 20.9c113-10.8 196 39.2 241.4 82.6\"/>\u003Cpath fill=\"#309e3a\" d=\"m414 252.4l2.3 1.3a3 3 0 0 0-.3 2.2a3 3 0 0 0 1.4 1.7q1 .8 2 .7q.9 0 1.3-.7l.2-.9l-.5-1l-1.5-1.8a8 8 0 0 1-1.8-3a4 4 0 0 1 2-4.4a4 4 0 0 1 2.3-.2a7 7 0 0 1 2.6 1.2q2.1 1.5 2.6 3.2a4 4 0 0 1-.6 3.3l-2.4-1.5q.5-1 .2-1.7q-.2-.8-1.2-1.4a3 3 0 0 0-1.8-.7a1 1 0 0 0-.9.5q-.3.4-.1 1q.2.8 1.6 2.2t2 2.5a4 4 0 0 1-.3 4.2a4 4 0 0 1-1.9 1.5a4 4 0 0 1-2.4.3q-1.3-.3-2.8-1.3q-2.2-1.5-2.7-3.3a5 5 0 0 1 .6-4zm-11.6-7.6l2.5 1.3a3 3 0 0 0-.2 2.2a3 3 0 0 0 1.4 1.6q1.1.8 2 .6q.9 0 1.3-.8l.2-.8q0-.5-.5-1l-1.6-1.8q-1.7-1.6-2-2.8a4 4 0 0 1 .4-3.1a4 4 0 0 1 1.6-1.4a4 4 0 0 1 2.2-.3a7 7 0 0 1 2.6 1q2.3 1.5 2.7 3.1a4 4 0 0 1-.4 3.4l-2.5-1.4q.5-1 .2-1.7q-.4-1-1.3-1.4a3 3 0 0 0-1.9-.6a1 1 0 0 0-.8.5q-.3.4-.1 1q.3.8 1.7 2.2q1.5 1.5 2 2.4a4 4 0 0 1 0 4.2a4 4 0 0 1-1.8 1.6a4 4 0 0 1-2.4.3a8 8 0 0 1-2.9-1.1a6 6 0 0 1-2.8-3.2a5 5 0 0 1 .4-4m-14.2-3.8l7.3-12l8.8 5.5l-1.2 2l-6.4-4l-1.6 2.7l6 3.7l-1.3 2l-6-3.7l-2 3.3l6.7 4l-1.2 2zm-20.7-17l1.1-2l5.4 2.7l-2.5 5q-1.2.3-3 .2a9 9 0 0 1-3.3-1a8 8 0 0 1-3-2.6a6 6 0 0 1-1-3.5a9 9 0 0 1 1-3.7a8 8 0 0 1 2.6-3a6 6 0 0 1 3.6-1.1q1.4 0 3.2 1q2.4 1.1 3.1 2.8a5 5 0 0 1 .3 3.5l-2.7-.8a3 3 0 0 0-.2-2q-.4-.9-1.6-1.4a4 4 0 0 0-3.1-.3q-1.5.5-2.6 2.6t-.7 3.8a4 4 0 0 0 2 2.4q.8.5 1.7.5h1.8l.8-1.6zm-90.2-22.3l2-14l4.2.7l1.1 9.8l3.9-9l4.2.6l-2 13.8l-2.7-.4l1.7-10.9l-4.4 10.5l-2.7-.4l-1.1-11.3l-1.6 11zm-14.1-1.7l1.3-14l10.3 1l-.2 2.4l-7.5-.7l-.3 3l7 .7l-.3 2.4l-7-.7l-.3 3.8l7.8.7l-.2 2.4z\"/>\u003Cg stroke-opacity=\".5\">\u003Cpath fill=\"#309e3a\" d=\"M216.5 191.3q0-2.2.7-3.6a7 7 0 0 1 1.4-1.9a5 5 0 0 1 1.8-1.2q1.5-.5 3-.5q3.1.1 5 2a7 7 0 0 1 1.6 5.5q0 3.3-2 5.3a7 7 0 0 1-5 1.7a7 7 0 0 1-4.8-2a7 7 0 0 1-1.7-5.3\"/>\u003Cpath fill=\"#f7ffff\" d=\"M219.4 191.3q0 2.3 1 3.6t2.8 1.3a4 4 0 0 0 2.8-1.1q1-1.2 1.1-3.7q.1-2.4-1-3.6a4 4 0 0 0-2.7-1.3a4 4 0 0 0-2.8 1.2q-1.1 1.2-1.2 3.6\"/>\u003C/g>\u003Cg stroke-opacity=\".5\">\u003Cpath fill=\"#309e3a\" d=\"m233 198.5l.2-14h6q2.2 0 3.2.5q1 .3 1.6 1.3c.6 1 .6 1.4.6 2.3a4 4 0 0 1-1 2.6a5 5 0 0 1-2.7 1.2l1.5 1.2q.6.6 1.5 2.3l1.7 2.8h-3.4l-2-3.2l-1.4-2l-.9-.6l-1.4-.2h-.6v5.8z\"/>\u003Cpath fill=\"#fff\" d=\"M236 190.5h2q2.1 0 2.6-.2q.5-.1.8-.5q.4-.6.3-1q0-.9-.4-1.2q-.3-.4-1-.6h-2l-2.3-.1z\"/>\u003C/g>\u003Cg stroke-opacity=\".5\">\u003Cpath fill=\"#309e3a\" d=\"m249 185.2l5.2.3q1.7 0 2.6.3a5 5 0 0 1 2 1.4a6 6 0 0 1 1.2 2.4q.4 1.4.3 3.3a9 9 0 0 1-.5 3q-.6 1.5-1.7 2.4a5 5 0 0 1-2 1q-1 .3-2.5.2l-5.3-.3z\"/>\u003Cpath fill=\"#fff\" d=\"m251.7 187.7l-.5 9.3h3.8q.8 0 1.2-.5q.5-.4.8-1.3t.4-2.6l-.1-2.5a3 3 0 0 0-.8-1.4l-1.2-.7l-2.3-.3z\"/>\u003C/g>\u003Cg stroke-opacity=\".5\">\u003Cpath fill=\"#309e3a\" d=\"m317.6 210.2l3.3-13.6l4.4 1l3.2 1q1.1.6 1.6 1.9t.2 2.8q-.3 1.2-1 2a4 4 0 0 1-3 1.4q-1 0-3-.5l-1.7-.5l-1.2 5.2z\"/>\u003Cpath fill=\"#fff\" d=\"m323 199.6l-.8 3.8l1.5.4q1.6.4 2.2.3a2 2 0 0 0 1.6-1.5q0-.7-.2-1.3a2 2 0 0 0-1-.9l-1.9-.5l-1.3-.3z\"/>\u003C/g>\u003Cg stroke-opacity=\".5\">\u003Cpath fill=\"#309e3a\" d=\"m330.6 214.1l4.7-13.2l5.5 2q2.2.8 3 1.4q.8.7 1 1.8c.2 1.1.2 1.5 0 2.3q-.6 1.5-1.8 2.2q-1.2.6-3 .3q.6.7 1 1.6l.8 2.7l.6 3.1l-3.1-1.1l-1-3.6l-.7-2.4l-.6-.8q-.3-.4-1.3-.7l-.5-.2l-2 5.6z\"/>\u003Cpath fill=\"#fff\" d=\"m336 207.4l1.9.7q2 .7 2.5.7t.9-.3q.5-.3.6-.9q.3-.6 0-1.2l-.8-.9l-2-.7l-2-.7l-1.2 3.3z\"/>\u003C/g>\u003Cg stroke-opacity=\".5\">\u003Cpath fill=\"#309e3a\" d=\"M347 213.6a9 9 0 0 1 1.7-3.2l1.8-1.5l2-.7q1.5-.1 3.1.4a7 7 0 0 1 4.2 3.3q1.2 2.4.2 5.7a7 7 0 0 1-3.4 4.5q-2.3 1.3-5.2.4a7 7 0 0 1-4.2-3.3a7 7 0 0 1-.2-5.6\"/>\u003Cpath fill=\"#fff\" d=\"M349.8 214.4q-.7 2.3 0 3.8c.7 1.5 1.2 1.6 2.3 2q1.5.5 3-.4q1.4-.8 2.1-3.2q.8-2.2 0-3.7a4 4 0 0 0-2.2-2a4 4 0 0 0-3 .3q-1.5.8-2.2 3.2\"/>\u003C/g>\u003Cg stroke-opacity=\".5\">\u003Cpath fill=\"#309e3a\" d=\"m374.3 233.1l6.4-12.4l5.3 2.7a10 10 0 0 1 2.7 1.9q.8.7.8 1.9c0 1.2 0 1.5-.4 2.2a4 4 0 0 1-2 2q-1.5.4-3.1-.2q.6 1 .8 1.7q.3.9.4 2.8l.2 3.2l-3-1.5l-.4-3.7l-.3-2.5l-.5-1l-1.2-.7l-.5-.3l-2.7 5.2z\"/>\u003Cpath fill=\"#fff\" d=\"m380.5 227.2l1.9 1q1.8 1 2.3 1t1-.2q.4-.2.7-.8t.2-1.2l-.7-1l-1.8-1l-2-1z\"/>\u003C/g>\u003Cg stroke-opacity=\".5\">\u003Cpath fill=\"#309e3a\" d=\"M426.1 258.7a9 9 0 0 1 2.5-2.6a7 7 0 0 1 2.2-.9a6 6 0 0 1 2.2 0q1.5.3 2.8 1.2a7 7 0 0 1 3 4.4q.4 2.6-1.4 5.5a7 7 0 0 1-4.5 3.3a7 7 0 0 1-5.2-1.1a7 7 0 0 1-3-4.4q-.4-2.7 1.4-5.4\"/>\u003Cpath fill=\"#fff\" d=\"M428.6 260.3q-1.4 2-1.1 3.6a4 4 0 0 0 1.6 2.5q1.5 1 3 .6t2.9-2.4q1.4-2.1 1.1-3.6t-1.6-2.6c-1.4-1.1-2-.8-3-.5q-1.5.3-3 2.4z\"/>\u003C/g>\u003Cpath fill=\"#309e3a\" d=\"m301.8 204.5l2.3-9.8l7.2 1.7l-.3 1.6l-5.3-1.2l-.5 2.2l4.9 1.1l-.4 1.7l-4.9-1.2l-.6 2.7l5.5 1.3l-.4 1.6z\"/>\u003C/g>",{"left":4,"top":4,"width":14,"height":15,"rotate":4,"vFlip":6,"hFlip":6,"body":18},"\u003Cpath fill=\"#bd3d44\" d=\"M0 0h640v480H0\"/>\u003Cpath stroke=\"#fff\" stroke-width=\"37\" d=\"M0 55.3h640M0 129h640M0 203h640M0 277h640M0 351h640M0 425h640\"/>\u003Cpath fill=\"#192f5d\" d=\"M0 0h364.8v258.5H0\"/>\u003Cmarker id=\"SVGEq3dreKJ\" markerHeight=\"30\" markerWidth=\"30\">\u003Cpath fill=\"#fff\" d=\"m14 0l9 27L0 10h28L5 27z\"/>\u003C/marker>\u003Cpath fill=\"none\" marker-mid=\"url(#SVGEq3dreKJ)\" d=\"m0 0l16 11h61h61h61h61h60L47 37h61h61h60h61L16 63h61h61h61h61h60L47 89h61h61h60h61L16 115h61h61h61h61h60L47 141h61h61h60h61L16 166h61h61h61h61h60L47 192h61h61h60h61L16 218h61h61h61h61h60z\"/>",{"id":20,"title":21,"body":22,"description":54,"description_en":2256,"description_pt":2257,"draft":6,"extension":2258,"meta":2259,"navigation":143,"path":2260,"publishDate":2261,"seo":2262,"slug":2263,"stem":2264,"tags":2265,"title_en":2269,"title_pt":2270,"__hash__":2271},"blog/blog/zod-why-how-when.md","Zod Why How When",{"type":23,"value":24,"toc":2254},"minimark",[25,38,48,324,329,334,354,359,364,389,656,694,699,704,768,773,778,786,808,827,890,898,906,960,971,981,1832,1875,1880,1885,2222,2236,2250],[26,27,29],"lang-block",{"lang":28},"en",[30,31,32,33,37],"p",{},"Something that can confuse developers who are starting with TypeScript/JavaScript is type checking: types are checked ",[34,35,36],"strong",{},"only"," during TypeScript compilation.",[26,39,41],{"lang":40},"pt",[30,42,43,44,47],{},"Algo que pode confundir desenvolvedores que estão começando a estudar Typescript/Javascript é a verificação de tipos: eles são verificados ",[34,45,46],{},"somente"," durante a compilação de Typescript para Javascript:",[49,50,55],"pre",{"className":51,"code":52,"language":53,"meta":54,"style":54},"language-ts shiki shiki-themes github-dark github-dark github-light","type Post = {\n  userId: number,\n  id: number,\n  title: string,\n  body: string,\n}\n\nasync function getPost(id: number): Promise\u003CPost> {\n  const response = await fetch(`https://jsonplaceholder.typicode.com/posts/${id}`);\n  const json = await response.json();\n\n  return json as Post;\n}\n\nconst post = await getPost(1);\n\n// If the API returns \"postTitle\" instead of \"title\":\nconst title = post.title // undefined\n// For TypeScript, title is still `string`, because we said it would be.\n","ts","",[56,57,58,78,95,107,120,132,138,145,184,215,236,241,258,263,268,290,295,302,318],"code",{"__ignoreMap":54},[59,60,63,67,71,74],"span",{"class":61,"line":62},"line",1,[59,64,66],{"class":65},"s6ubI","type",[59,68,70],{"class":69},"s5n6i"," Post",[59,72,73],{"class":65}," =",[59,75,77],{"class":76},"sAvwS"," {\n",[59,79,81,85,88,92],{"class":61,"line":80},2,[59,82,84],{"class":83},"sAzo5","  userId",[59,86,87],{"class":65},":",[59,89,91],{"class":90},"sXWYR"," number",[59,93,94],{"class":76},",\n",[59,96,98,101,103,105],{"class":61,"line":97},3,[59,99,100],{"class":83},"  id",[59,102,87],{"class":65},[59,104,91],{"class":90},[59,106,94],{"class":76},[59,108,110,113,115,118],{"class":61,"line":109},4,[59,111,112],{"class":83},"  title",[59,114,87],{"class":65},[59,116,117],{"class":90}," string",[59,119,94],{"class":76},[59,121,123,126,128,130],{"class":61,"line":122},5,[59,124,125],{"class":83},"  body",[59,127,87],{"class":65},[59,129,117],{"class":90},[59,131,94],{"class":76},[59,133,135],{"class":61,"line":134},6,[59,136,137],{"class":76},"}\n",[59,139,141],{"class":61,"line":140},7,[59,142,144],{"emptyLinePlaceholder":143},true,"\n",[59,146,148,151,154,157,160,163,165,167,170,172,175,178,181],{"class":61,"line":147},8,[59,149,150],{"class":65},"async",[59,152,153],{"class":65}," function",[59,155,156],{"class":69}," getPost",[59,158,159],{"class":76},"(",[59,161,162],{"class":83},"id",[59,164,87],{"class":65},[59,166,91],{"class":90},[59,168,169],{"class":76},")",[59,171,87],{"class":65},[59,173,174],{"class":69}," Promise",[59,176,177],{"class":76},"\u003C",[59,179,180],{"class":69},"Post",[59,182,183],{"class":76},"> {\n",[59,185,187,190,193,195,198,201,203,207,209,212],{"class":61,"line":186},9,[59,188,189],{"class":65},"  const",[59,191,192],{"class":90}," response",[59,194,73],{"class":65},[59,196,197],{"class":65}," await",[59,199,200],{"class":69}," fetch",[59,202,159],{"class":76},[59,204,206],{"class":205},"s4Y1p","`https://jsonplaceholder.typicode.com/posts/${",[59,208,162],{"class":76},[59,210,211],{"class":205},"}`",[59,213,214],{"class":76},");\n",[59,216,218,220,223,225,227,230,233],{"class":61,"line":217},10,[59,219,189],{"class":65},[59,221,222],{"class":90}," json",[59,224,73],{"class":65},[59,226,197],{"class":65},[59,228,229],{"class":76}," response.",[59,231,232],{"class":69},"json",[59,234,235],{"class":76},"();\n",[59,237,239],{"class":61,"line":238},11,[59,240,144],{"emptyLinePlaceholder":143},[59,242,244,247,250,253,255],{"class":61,"line":243},12,[59,245,246],{"class":65},"  return",[59,248,249],{"class":76}," json ",[59,251,252],{"class":65},"as",[59,254,70],{"class":69},[59,256,257],{"class":76},";\n",[59,259,261],{"class":61,"line":260},13,[59,262,137],{"class":76},[59,264,266],{"class":61,"line":265},14,[59,267,144],{"emptyLinePlaceholder":143},[59,269,271,274,277,279,281,283,285,288],{"class":61,"line":270},15,[59,272,273],{"class":65},"const",[59,275,276],{"class":90}," post",[59,278,73],{"class":65},[59,280,197],{"class":65},[59,282,156],{"class":69},[59,284,159],{"class":76},[59,286,287],{"class":90},"1",[59,289,214],{"class":76},[59,291,293],{"class":61,"line":292},16,[59,294,144],{"emptyLinePlaceholder":143},[59,296,298],{"class":61,"line":297},17,[59,299,301],{"class":300},"sxXm1","// If the API returns \"postTitle\" instead of \"title\":\n",[59,303,305,307,310,312,315],{"class":61,"line":304},18,[59,306,273],{"class":65},[59,308,309],{"class":90}," title",[59,311,73],{"class":65},[59,313,314],{"class":76}," post.title ",[59,316,317],{"class":300},"// undefined\n",[59,319,321],{"class":61,"line":320},19,[59,322,323],{"class":300},"// For TypeScript, title is still `string`, because we said it would be.\n",[26,325,326],{"lang":28},[30,327,328],{},"There is a difference between type checking and runtime validation. Whenever you are working with data you do not control, but expect in a specific shape, it is important to parse all that data to avoid runtime errors, or at least define behavior when actual input does not match the expected format.",[26,330,331],{"lang":40},[30,332,333],{},"Existe uma diferença entre verificação de tipos e verificação em runtime. Sempre que você está trabalhando com dados que você não controla, mas que você espera um formato específico, é importante você parsear todos esse dados, para evitar possíveis erros, ou permitir que você defina o comportamento quando o formato esperado não bate com o formato que você recebeu.",[335,336,339,349],"more-info",{"title-en":337,"title-pt":338},"Parsing vs Validation","Parsing vs Validação",[340,341,342],"template",{"v-slot:en":54},[30,343,344,345,348],{},"There is a subtle difference between these terms. Validation means using a function that checks whether data is valid. Parsing means using a function that validates ",[34,346,347],{},"and transforms"," data into the expected format, checking for possible errors.",[340,350,351],{"v-slot:pt":54},[30,352,353],{},"Existe uma diferença sútil entre esses dois termos. Validar significa utilizar uma função que verifica se os dados são válidos. Parsear significa utilizar uma função que valida E transforma os dados no formato esperado, verificando possíveis erros.",[26,355,356],{"lang":28},[30,357,358],{},"Zod is a parsing library. Its biggest advantages are flexibility, transformation APIs, and TypeScript integration. The idea is to define schemas using functions and extract TypeScript definitions from them, centralizing all information in one place.",[26,360,361],{"lang":40},[30,362,363],{},"O Zod é uma biblioteca de parsing, que a maior vantagem é sua flexibilidade, API de transformação e integração com Typescript. A ideia é você definir \"schemas\", utilizando funções, com a possibilidade de extrair definições de Typescript, centralizando todas informações em um só lugar.",[365,366,367,380],"note",{},[340,368,369],{"v-slot:en":54},[30,370,371,372,379],{},"In this article, we use Zod v4. The API may differ from previous versions, but concepts are the same. For more information, check the ",[373,374,378],"a",{"href":375,"rel":376},"https://zod.dev/v4/changelog",[377],"nofollow","project documentation",".",[340,381,382],{"v-slot:pt":54},[30,383,384,385],{},"Nesse artigo, iremos utilizar a versão 4 do Zod. A API pode ser diferente, mas os conceitos permanecem os mesmos. Para mais informações, acesse a ",[373,386,388],{"href":375,"rel":387},[377],"documentação do projeto.",[49,390,392],{"className":51,"code":391,"language":53,"meta":54,"style":54},"import * as z from \"zod\";\n\nconst Post = z.object({\n  userId: z.number(),\n  id: z.number(),\n  title: z.string(),\n  body: z.string(),\n});\n\ntype Post = z.infer\u003Ctypeof Post>;\n\nasync function getPost(id: number): Promise\u003CPost> {\n  const response = await fetch(\n    `https://jsonplaceholder.typicode.com/posts/${id}`,\n  );\n  const json = await response.json();\n  const post = Post.parse(json);\n  return post;\n}\n\nconst post = await getPost(1);\n\n// Safe to access\npost.title\n",[56,393,394,416,420,437,448,457,467,476,481,485,509,513,541,556,567,572,588,605,612,616,621,640,645,651],{"__ignoreMap":54},[59,395,396,399,402,405,408,411,414],{"class":61,"line":62},[59,397,398],{"class":65},"import",[59,400,401],{"class":90}," *",[59,403,404],{"class":65}," as",[59,406,407],{"class":76}," z ",[59,409,410],{"class":65},"from",[59,412,413],{"class":205}," \"zod\"",[59,415,257],{"class":76},[59,417,418],{"class":61,"line":80},[59,419,144],{"emptyLinePlaceholder":143},[59,421,422,424,426,428,431,434],{"class":61,"line":97},[59,423,273],{"class":65},[59,425,70],{"class":90},[59,427,73],{"class":65},[59,429,430],{"class":76}," z.",[59,432,433],{"class":69},"object",[59,435,436],{"class":76},"({\n",[59,438,439,442,445],{"class":61,"line":109},[59,440,441],{"class":76},"  userId: z.",[59,443,444],{"class":69},"number",[59,446,447],{"class":76},"(),\n",[59,449,450,453,455],{"class":61,"line":122},[59,451,452],{"class":76},"  id: z.",[59,454,444],{"class":69},[59,456,447],{"class":76},[59,458,459,462,465],{"class":61,"line":134},[59,460,461],{"class":76},"  title: z.",[59,463,464],{"class":69},"string",[59,466,447],{"class":76},[59,468,469,472,474],{"class":61,"line":140},[59,470,471],{"class":76},"  body: z.",[59,473,464],{"class":69},[59,475,447],{"class":76},[59,477,478],{"class":61,"line":147},[59,479,480],{"class":76},"});\n",[59,482,483],{"class":61,"line":186},[59,484,144],{"emptyLinePlaceholder":143},[59,486,487,489,491,493,496,498,501,503,506],{"class":61,"line":217},[59,488,66],{"class":65},[59,490,70],{"class":69},[59,492,73],{"class":65},[59,494,495],{"class":69}," z",[59,497,379],{"class":76},[59,499,500],{"class":69},"infer",[59,502,177],{"class":76},[59,504,505],{"class":65},"typeof",[59,507,508],{"class":76}," Post>;\n",[59,510,511],{"class":61,"line":238},[59,512,144],{"emptyLinePlaceholder":143},[59,514,515,517,519,521,523,525,527,529,531,533,535,537,539],{"class":61,"line":243},[59,516,150],{"class":65},[59,518,153],{"class":65},[59,520,156],{"class":69},[59,522,159],{"class":76},[59,524,162],{"class":83},[59,526,87],{"class":65},[59,528,91],{"class":90},[59,530,169],{"class":76},[59,532,87],{"class":65},[59,534,174],{"class":69},[59,536,177],{"class":76},[59,538,180],{"class":69},[59,540,183],{"class":76},[59,542,543,545,547,549,551,553],{"class":61,"line":260},[59,544,189],{"class":65},[59,546,192],{"class":90},[59,548,73],{"class":65},[59,550,197],{"class":65},[59,552,200],{"class":69},[59,554,555],{"class":76},"(\n",[59,557,558,561,563,565],{"class":61,"line":265},[59,559,560],{"class":205},"    `https://jsonplaceholder.typicode.com/posts/${",[59,562,162],{"class":76},[59,564,211],{"class":205},[59,566,94],{"class":76},[59,568,569],{"class":61,"line":270},[59,570,571],{"class":76},"  );\n",[59,573,574,576,578,580,582,584,586],{"class":61,"line":292},[59,575,189],{"class":65},[59,577,222],{"class":90},[59,579,73],{"class":65},[59,581,197],{"class":65},[59,583,229],{"class":76},[59,585,232],{"class":69},[59,587,235],{"class":76},[59,589,590,592,594,596,599,602],{"class":61,"line":297},[59,591,189],{"class":65},[59,593,276],{"class":90},[59,595,73],{"class":65},[59,597,598],{"class":76}," Post.",[59,600,601],{"class":69},"parse",[59,603,604],{"class":76},"(json);\n",[59,606,607,609],{"class":61,"line":304},[59,608,246],{"class":65},[59,610,611],{"class":76}," post;\n",[59,613,614],{"class":61,"line":320},[59,615,137],{"class":76},[59,617,619],{"class":61,"line":618},20,[59,620,144],{"emptyLinePlaceholder":143},[59,622,624,626,628,630,632,634,636,638],{"class":61,"line":623},21,[59,625,273],{"class":65},[59,627,276],{"class":90},[59,629,73],{"class":65},[59,631,197],{"class":65},[59,633,156],{"class":69},[59,635,159],{"class":76},[59,637,287],{"class":90},[59,639,214],{"class":76},[59,641,643],{"class":61,"line":642},22,[59,644,144],{"emptyLinePlaceholder":143},[59,646,648],{"class":61,"line":647},23,[59,649,650],{"class":300},"// Safe to access\n",[59,652,653],{"class":61,"line":5},[59,654,655],{"class":76},"post.title\n",[335,657,659,677],{"title-en":658,"title-pt":658},"type Post vs const Post",[340,660,661,670],{"v-slot:en":54},[30,662,663,664,666,667,669],{},"You might have noticed that we have a type called ",[56,665,180],{}," and a constant called ",[56,668,180],{},". That is valid because types are erased after compilation to JavaScript. Based on syntax, TypeScript knows whether you are referring to the type or the constant.",[30,671,672,673,676],{},"If you find that confusing, a common alternative is always using the ",[56,674,675],{},"Schema"," suffix.",[340,678,679,688],{"v-slot:pt":54},[30,680,681,682,684,685,687],{},"Você pode ter notado que temos um tipo chamado ",[56,683,180],{}," e uma constante chamado ",[56,686,180],{},". Isso é valido pois o tipo é apagado do código depois da compilação para Javascript. Baseado na syntax, o Typescript sabe se você está utilizando o tipo ou a constante.",[30,689,690,691,693],{},"Caso você acha isso confuso, uma alternativa é utilizar sempre o sufixo ",[56,692,675],{},", para diferenciar melhor os dois.",[26,695,696],{"lang":28},[30,697,698],{},"And what happens if input shape is not what we expect?",[26,700,701],{"lang":40},[30,702,703],{},"E o que acontece se o formato não é o esperado?",[49,705,707],{"className":51,"code":706,"language":53,"meta":54,"style":54},"const wrongPost = {\n  userId: \"not-a-number\",\n  id: 1,\n  body: \"This is a test post.\",\n};\n\nPost.parse(wrongPost);\n",[56,708,709,720,730,739,749,754,758],{"__ignoreMap":54},[59,710,711,713,716,718],{"class":61,"line":62},[59,712,273],{"class":65},[59,714,715],{"class":90}," wrongPost",[59,717,73],{"class":65},[59,719,77],{"class":76},[59,721,722,725,728],{"class":61,"line":80},[59,723,724],{"class":76},"  userId: ",[59,726,727],{"class":205},"\"not-a-number\"",[59,729,94],{"class":76},[59,731,732,735,737],{"class":61,"line":97},[59,733,734],{"class":76},"  id: ",[59,736,287],{"class":90},[59,738,94],{"class":76},[59,740,741,744,747],{"class":61,"line":109},[59,742,743],{"class":76},"  body: ",[59,745,746],{"class":205},"\"This is a test post.\"",[59,748,94],{"class":76},[59,750,751],{"class":61,"line":122},[59,752,753],{"class":76},"};\n",[59,755,756],{"class":61,"line":134},[59,757,144],{"emptyLinePlaceholder":143},[59,759,760,763,765],{"class":61,"line":140},[59,761,762],{"class":76},"Post.",[59,764,601],{"class":69},[59,766,767],{"class":76},"(wrongPost);\n",[26,769,770],{"lang":28},[30,771,772],{},"You end up with an error like:",[26,774,775],{"lang":40},[30,776,777],{},"Nós vamos acabar com o seguinte erro:",[49,779,784],{"className":780,"code":782,"language":783},[781],"language-text","ZodError: [\n  {\n    \"expected\": \"number\",\n    \"code\": \"invalid_type\",\n    \"path\": [\n      \"userId\"\n    ],\n    \"message\": \"Invalid input: expected number, received string\"\n  },\n  {\n    \"expected\": \"string\",\n    \"code\": \"invalid_type\",\n    \"path\": [\n      \"title\"\n    ],\n    \"message\": \"Invalid input: expected string, received undefined\"\n  }\n]\n","text",[56,785,782],{"__ignoreMap":54},[26,787,788,791],{"lang":28},[30,789,790],{},"Notice how the error contains complete information and accumulated issues, instead of stopping at the first one.",[30,792,793,794,797,798,801,802,807],{},"I personally do not love the ",[56,795,796],{},"try/catch"," style, so I prefer ",[56,799,800],{},"safeParse",", which returns a ",[373,803,806],{"href":804,"rel":805},"https://www.typescriptlang.org/docs/handbook/2/narrowing.html#discriminated-unions",[377],"discriminated union"," indicating success + parsed value, or failure + errors:",[26,809,810,813],{"lang":40},[30,811,812],{},"Note que o nosso erro contem todas as informações e os erros acumuladas, ao invés de incluir somente o primeiro erro encontrado.",[30,814,815,816,818,819,821,822,826],{},"Eu particularmente não gosto do padrão de ",[56,817,796],{},", por isso prefiro utilizar o ",[56,820,800],{}," que retorna uma \"",[373,823,825],{"href":804,"rel":824},[377],"união discriminada","\", indicando o resultado do parsing, o valor parseado ou os erros:",[49,828,830],{"className":51,"code":829,"language":53,"meta":54,"style":54},"if (result.success) {\n  // Since `success` is true, `data` is guaranteed\n  console.log(result.data.title);\n} else {\n  // Validation failed\n  console.error(\"Validation failed:\", result.error);\n}\n",[56,831,832,840,845,856,866,871,886],{"__ignoreMap":54},[59,833,834,837],{"class":61,"line":62},[59,835,836],{"class":65},"if",[59,838,839],{"class":76}," (result.success) {\n",[59,841,842],{"class":61,"line":80},[59,843,844],{"class":300},"  // Since `success` is true, `data` is guaranteed\n",[59,846,847,850,853],{"class":61,"line":97},[59,848,849],{"class":76},"  console.",[59,851,852],{"class":69},"log",[59,854,855],{"class":76},"(result.data.title);\n",[59,857,858,861,864],{"class":61,"line":109},[59,859,860],{"class":76},"} ",[59,862,863],{"class":65},"else",[59,865,77],{"class":76},[59,867,868],{"class":61,"line":122},[59,869,870],{"class":300},"  // Validation failed\n",[59,872,873,875,878,880,883],{"class":61,"line":134},[59,874,849],{"class":76},[59,876,877],{"class":69},"error",[59,879,159],{"class":76},[59,881,882],{"class":205},"\"Validation failed:\"",[59,884,885],{"class":76},", result.error);\n",[59,887,888],{"class":61,"line":140},[59,889,137],{"class":76},[26,891,892],{"lang":28},[30,893,894,895,87],{},"Zod provides helpers to improve errors. One of the most useful is ",[56,896,897],{},"prettifyError()",[26,899,900],{"lang":40},[30,901,902,903,905],{},"O Zed fornece algumas funções para modificar esse erro. A mais útil é a ",[56,904,897],{},", que deixa um pouco mais fácil de entender o erro:",[49,907,909],{"className":51,"code":908,"language":53,"meta":54,"style":54},"// Continuing from the previous example\nconsole.error(prettifyError(result.error));\n\n// Output:\n// ✖ Invalid input: expected number, received string\n//  → at userId\n// ✖ Invalid input: expected string, received undefined\n//  → at title\n",[56,910,911,916,931,935,940,945,950,955],{"__ignoreMap":54},[59,912,913],{"class":61,"line":62},[59,914,915],{"class":300},"// Continuing from the previous example\n",[59,917,918,921,923,925,928],{"class":61,"line":80},[59,919,920],{"class":76},"console.",[59,922,877],{"class":69},[59,924,159],{"class":76},[59,926,927],{"class":69},"prettifyError",[59,929,930],{"class":76},"(result.error));\n",[59,932,933],{"class":61,"line":97},[59,934,144],{"emptyLinePlaceholder":143},[59,936,937],{"class":61,"line":109},[59,938,939],{"class":300},"// Output:\n",[59,941,942],{"class":61,"line":122},[59,943,944],{"class":300},"// ✖ Invalid input: expected number, received string\n",[59,946,947],{"class":61,"line":134},[59,948,949],{"class":300},"//  → at userId\n",[59,951,952],{"class":61,"line":140},[59,953,954],{"class":300},"// ✖ Invalid input: expected string, received undefined\n",[59,956,957],{"class":61,"line":147},[59,958,959],{"class":300},"//  → at title\n",[26,961,962],{"lang":28},[30,963,964,965,970],{},"Zod includes functions not only for primitives, but also for validating and transforming many input types. It is worth exploring the ",[373,966,969],{"href":967,"rel":968},"https://zod.dev/api",[377],"documentation",". Some relevant examples:",[26,972,973],{"lang":40},[30,974,975,976,980],{},"O Zod não tem funções somente para primitivos, como também funções para validar e transformar vários tipos de input. Vale a pena dar uma lida na ",[373,977,979],{"href":967,"rel":978},[377],"documentação"," para você ter uma ideia das possibilidades. Alguns exemplos mais relevantes:",[49,982,984],{"className":51,"code":983,"language":53,"meta":54,"style":54},"import * as z from \"zod\";\n\n// Object\nconst User = z.object({\n  // Converts any input to number (`true` -> 1, `false` -> 0)\n  id: z.coerce.number(),\n  // String length validation\n  name: z.string().min(2).max(100),\n  // Transform to lowercase + trim. Don't confuse with lowercase(), which only validates\n  displayName: z.string().trim().toLowerCase(),\n  // Email format\n  email: z.email(),\n  // ISO 8601 datetime -> Date object\n  createdAt: z.iso.datetime().transform((value) => new Date(value)),\n  // Positive number\n  age: z.number().positive(),\n  // Optional with default\n  isActive: z.boolean().default(true),\n  // One of two string values\n  role: z.enum([\"admin\", \"user\"]),\n  // Custom validation\n  password: z\n    .string()\n    .min(8)\n    .refine((value) => /[A-Z]/.test(value), {\n      message: \"Password must contain at least one uppercase letter\",\n    }),\n  // Custom transformation\n  team: z.enum([\"red\", \"blue\", \"team red\", \"team blue\"]).transform((value) => {\n    if (value === \"team red\") return \"red\";\n    if (value === \"team blue\") return \"blue\";\n    return value;\n  }),\n});\n\n// Array of objects\nconst Users = z.array(User);\n\ntype Users = z.infer\u003Ctypeof Users>;\n\n// Zod generated this Users definition:\n// type Users = {\n//     id: number;\n//     name: string;\n//     displayName: string;\n//     email: string;\n//     createdAt: Date;\n//     age: number;\n//     isActive: boolean;\n//     role: \"admin\" | \"user\";\n//     password: string;\n//     team: \"red\" | \"blue\";\n// }[]\n\n// Example usage\nconst result = Users.parse([\n  {\n    id: \"123\",\n    name: \"Alice\",\n    displayName: \" Alice \",\n    email: \"alice@test.com\",\n    createdAt: \"2023-10-01T12:00:00Z\",\n    age: 30,\n    role: \"admin\",\n    password: \"Password1\",\n    team: \"team red\",\n    userRole: \"admin\", // Extra field, ignored by default\n  },\n]);\n\nconsole.log(result);\n\n// Expected output:\n// [\n//   {\n//     id: 123,\n//     name: 'Alice',\n//     displayName: 'alice',\n//     email: 'alice@test.com',\n//     createdAt: 2023-10-01T12:00:00.000Z,\n//     age: 30,\n//     isActive: true,\n//     role: 'admin',\n//     password: 'Password1',\n//     team: 'red'\n//   }\n// ]\n",[56,985,986,1002,1006,1011,1026,1031,1040,1045,1077,1082,1101,1106,1116,1121,1155,1160,1174,1179,1199,1204,1227,1232,1237,1247,1261,1294,1305,1311,1317,1360,1385,1406,1415,1421,1426,1431,1437,1455,1460,1482,1487,1493,1499,1505,1511,1517,1523,1529,1535,1541,1547,1553,1559,1565,1570,1576,1594,1600,1611,1622,1633,1644,1655,1666,1676,1687,1697,1710,1716,1722,1727,1737,1742,1748,1754,1760,1766,1772,1778,1784,1790,1796,1802,1808,1814,1820,1826],{"__ignoreMap":54},[59,987,988,990,992,994,996,998,1000],{"class":61,"line":62},[59,989,398],{"class":65},[59,991,401],{"class":90},[59,993,404],{"class":65},[59,995,407],{"class":76},[59,997,410],{"class":65},[59,999,413],{"class":205},[59,1001,257],{"class":76},[59,1003,1004],{"class":61,"line":80},[59,1005,144],{"emptyLinePlaceholder":143},[59,1007,1008],{"class":61,"line":97},[59,1009,1010],{"class":300},"// Object\n",[59,1012,1013,1015,1018,1020,1022,1024],{"class":61,"line":109},[59,1014,273],{"class":65},[59,1016,1017],{"class":90}," User",[59,1019,73],{"class":65},[59,1021,430],{"class":76},[59,1023,433],{"class":69},[59,1025,436],{"class":76},[59,1027,1028],{"class":61,"line":122},[59,1029,1030],{"class":300},"  // Converts any input to number (`true` -> 1, `false` -> 0)\n",[59,1032,1033,1036,1038],{"class":61,"line":134},[59,1034,1035],{"class":76},"  id: z.coerce.",[59,1037,444],{"class":69},[59,1039,447],{"class":76},[59,1041,1042],{"class":61,"line":140},[59,1043,1044],{"class":300},"  // String length validation\n",[59,1046,1047,1050,1052,1055,1058,1060,1063,1066,1069,1071,1074],{"class":61,"line":147},[59,1048,1049],{"class":76},"  name: z.",[59,1051,464],{"class":69},[59,1053,1054],{"class":76},"().",[59,1056,1057],{"class":69},"min",[59,1059,159],{"class":76},[59,1061,1062],{"class":90},"2",[59,1064,1065],{"class":76},").",[59,1067,1068],{"class":69},"max",[59,1070,159],{"class":76},[59,1072,1073],{"class":90},"100",[59,1075,1076],{"class":76},"),\n",[59,1078,1079],{"class":61,"line":186},[59,1080,1081],{"class":300},"  // Transform to lowercase + trim. Don't confuse with lowercase(), which only validates\n",[59,1083,1084,1087,1089,1091,1094,1096,1099],{"class":61,"line":217},[59,1085,1086],{"class":76},"  displayName: z.",[59,1088,464],{"class":69},[59,1090,1054],{"class":76},[59,1092,1093],{"class":69},"trim",[59,1095,1054],{"class":76},[59,1097,1098],{"class":69},"toLowerCase",[59,1100,447],{"class":76},[59,1102,1103],{"class":61,"line":238},[59,1104,1105],{"class":300},"  // Email format\n",[59,1107,1108,1111,1114],{"class":61,"line":243},[59,1109,1110],{"class":76},"  email: z.",[59,1112,1113],{"class":69},"email",[59,1115,447],{"class":76},[59,1117,1118],{"class":61,"line":260},[59,1119,1120],{"class":300},"  // ISO 8601 datetime -> Date object\n",[59,1122,1123,1126,1129,1131,1134,1137,1140,1143,1146,1149,1152],{"class":61,"line":265},[59,1124,1125],{"class":76},"  createdAt: z.iso.",[59,1127,1128],{"class":69},"datetime",[59,1130,1054],{"class":76},[59,1132,1133],{"class":69},"transform",[59,1135,1136],{"class":76},"((",[59,1138,1139],{"class":83},"value",[59,1141,1142],{"class":76},") ",[59,1144,1145],{"class":65},"=>",[59,1147,1148],{"class":65}," new",[59,1150,1151],{"class":69}," Date",[59,1153,1154],{"class":76},"(value)),\n",[59,1156,1157],{"class":61,"line":270},[59,1158,1159],{"class":300},"  // Positive number\n",[59,1161,1162,1165,1167,1169,1172],{"class":61,"line":292},[59,1163,1164],{"class":76},"  age: z.",[59,1166,444],{"class":69},[59,1168,1054],{"class":76},[59,1170,1171],{"class":69},"positive",[59,1173,447],{"class":76},[59,1175,1176],{"class":61,"line":297},[59,1177,1178],{"class":300},"  // Optional with default\n",[59,1180,1181,1184,1187,1189,1192,1194,1197],{"class":61,"line":304},[59,1182,1183],{"class":76},"  isActive: z.",[59,1185,1186],{"class":69},"boolean",[59,1188,1054],{"class":76},[59,1190,1191],{"class":69},"default",[59,1193,159],{"class":76},[59,1195,1196],{"class":90},"true",[59,1198,1076],{"class":76},[59,1200,1201],{"class":61,"line":320},[59,1202,1203],{"class":300},"  // One of two string values\n",[59,1205,1206,1209,1212,1215,1218,1221,1224],{"class":61,"line":618},[59,1207,1208],{"class":76},"  role: z.",[59,1210,1211],{"class":69},"enum",[59,1213,1214],{"class":76},"([",[59,1216,1217],{"class":205},"\"admin\"",[59,1219,1220],{"class":76},", ",[59,1222,1223],{"class":205},"\"user\"",[59,1225,1226],{"class":76},"]),\n",[59,1228,1229],{"class":61,"line":623},[59,1230,1231],{"class":300},"  // Custom validation\n",[59,1233,1234],{"class":61,"line":642},[59,1235,1236],{"class":76},"  password: z\n",[59,1238,1239,1242,1244],{"class":61,"line":647},[59,1240,1241],{"class":76},"    .",[59,1243,464],{"class":69},[59,1245,1246],{"class":76},"()\n",[59,1248,1249,1251,1253,1255,1258],{"class":61,"line":5},[59,1250,1241],{"class":76},[59,1252,1057],{"class":69},[59,1254,159],{"class":76},[59,1256,1257],{"class":90},"8",[59,1259,1260],{"class":76},")\n",[59,1262,1264,1266,1269,1271,1273,1275,1277,1280,1283,1286,1288,1291],{"class":61,"line":1263},25,[59,1265,1241],{"class":76},[59,1267,1268],{"class":69},"refine",[59,1270,1136],{"class":76},[59,1272,1139],{"class":83},[59,1274,1142],{"class":76},[59,1276,1145],{"class":65},[59,1278,1279],{"class":205}," /",[59,1281,1282],{"class":90},"[A-Z]",[59,1284,1285],{"class":205},"/",[59,1287,379],{"class":76},[59,1289,1290],{"class":69},"test",[59,1292,1293],{"class":76},"(value), {\n",[59,1295,1297,1300,1303],{"class":61,"line":1296},26,[59,1298,1299],{"class":76},"      message: ",[59,1301,1302],{"class":205},"\"Password must contain at least one uppercase letter\"",[59,1304,94],{"class":76},[59,1306,1308],{"class":61,"line":1307},27,[59,1309,1310],{"class":76},"    }),\n",[59,1312,1314],{"class":61,"line":1313},28,[59,1315,1316],{"class":300},"  // Custom transformation\n",[59,1318,1320,1323,1325,1327,1330,1332,1335,1337,1340,1342,1345,1348,1350,1352,1354,1356,1358],{"class":61,"line":1319},29,[59,1321,1322],{"class":76},"  team: z.",[59,1324,1211],{"class":69},[59,1326,1214],{"class":76},[59,1328,1329],{"class":205},"\"red\"",[59,1331,1220],{"class":76},[59,1333,1334],{"class":205},"\"blue\"",[59,1336,1220],{"class":76},[59,1338,1339],{"class":205},"\"team red\"",[59,1341,1220],{"class":76},[59,1343,1344],{"class":205},"\"team blue\"",[59,1346,1347],{"class":76},"]).",[59,1349,1133],{"class":69},[59,1351,1136],{"class":76},[59,1353,1139],{"class":83},[59,1355,1142],{"class":76},[59,1357,1145],{"class":65},[59,1359,77],{"class":76},[59,1361,1363,1366,1369,1372,1375,1377,1380,1383],{"class":61,"line":1362},30,[59,1364,1365],{"class":65},"    if",[59,1367,1368],{"class":76}," (value ",[59,1370,1371],{"class":65},"===",[59,1373,1374],{"class":205}," \"team red\"",[59,1376,1142],{"class":76},[59,1378,1379],{"class":65},"return",[59,1381,1382],{"class":205}," \"red\"",[59,1384,257],{"class":76},[59,1386,1388,1390,1392,1394,1397,1399,1401,1404],{"class":61,"line":1387},31,[59,1389,1365],{"class":65},[59,1391,1368],{"class":76},[59,1393,1371],{"class":65},[59,1395,1396],{"class":205}," \"team blue\"",[59,1398,1142],{"class":76},[59,1400,1379],{"class":65},[59,1402,1403],{"class":205}," \"blue\"",[59,1405,257],{"class":76},[59,1407,1409,1412],{"class":61,"line":1408},32,[59,1410,1411],{"class":65},"    return",[59,1413,1414],{"class":76}," value;\n",[59,1416,1418],{"class":61,"line":1417},33,[59,1419,1420],{"class":76},"  }),\n",[59,1422,1424],{"class":61,"line":1423},34,[59,1425,480],{"class":76},[59,1427,1429],{"class":61,"line":1428},35,[59,1430,144],{"emptyLinePlaceholder":143},[59,1432,1434],{"class":61,"line":1433},36,[59,1435,1436],{"class":300},"// Array of objects\n",[59,1438,1440,1442,1445,1447,1449,1452],{"class":61,"line":1439},37,[59,1441,273],{"class":65},[59,1443,1444],{"class":90}," Users",[59,1446,73],{"class":65},[59,1448,430],{"class":76},[59,1450,1451],{"class":69},"array",[59,1453,1454],{"class":76},"(User);\n",[59,1456,1458],{"class":61,"line":1457},38,[59,1459,144],{"emptyLinePlaceholder":143},[59,1461,1463,1465,1467,1469,1471,1473,1475,1477,1479],{"class":61,"line":1462},39,[59,1464,66],{"class":65},[59,1466,1444],{"class":69},[59,1468,73],{"class":65},[59,1470,495],{"class":69},[59,1472,379],{"class":76},[59,1474,500],{"class":69},[59,1476,177],{"class":76},[59,1478,505],{"class":65},[59,1480,1481],{"class":76}," Users>;\n",[59,1483,1485],{"class":61,"line":1484},40,[59,1486,144],{"emptyLinePlaceholder":143},[59,1488,1490],{"class":61,"line":1489},41,[59,1491,1492],{"class":300},"// Zod generated this Users definition:\n",[59,1494,1496],{"class":61,"line":1495},42,[59,1497,1498],{"class":300},"// type Users = {\n",[59,1500,1502],{"class":61,"line":1501},43,[59,1503,1504],{"class":300},"//     id: number;\n",[59,1506,1508],{"class":61,"line":1507},44,[59,1509,1510],{"class":300},"//     name: string;\n",[59,1512,1514],{"class":61,"line":1513},45,[59,1515,1516],{"class":300},"//     displayName: string;\n",[59,1518,1520],{"class":61,"line":1519},46,[59,1521,1522],{"class":300},"//     email: string;\n",[59,1524,1526],{"class":61,"line":1525},47,[59,1527,1528],{"class":300},"//     createdAt: Date;\n",[59,1530,1532],{"class":61,"line":1531},48,[59,1533,1534],{"class":300},"//     age: number;\n",[59,1536,1538],{"class":61,"line":1537},49,[59,1539,1540],{"class":300},"//     isActive: boolean;\n",[59,1542,1544],{"class":61,"line":1543},50,[59,1545,1546],{"class":300},"//     role: \"admin\" | \"user\";\n",[59,1548,1550],{"class":61,"line":1549},51,[59,1551,1552],{"class":300},"//     password: string;\n",[59,1554,1556],{"class":61,"line":1555},52,[59,1557,1558],{"class":300},"//     team: \"red\" | \"blue\";\n",[59,1560,1562],{"class":61,"line":1561},53,[59,1563,1564],{"class":300},"// }[]\n",[59,1566,1568],{"class":61,"line":1567},54,[59,1569,144],{"emptyLinePlaceholder":143},[59,1571,1573],{"class":61,"line":1572},55,[59,1574,1575],{"class":300},"// Example usage\n",[59,1577,1579,1581,1584,1586,1589,1591],{"class":61,"line":1578},56,[59,1580,273],{"class":65},[59,1582,1583],{"class":90}," result",[59,1585,73],{"class":65},[59,1587,1588],{"class":76}," Users.",[59,1590,601],{"class":69},[59,1592,1593],{"class":76},"([\n",[59,1595,1597],{"class":61,"line":1596},57,[59,1598,1599],{"class":76},"  {\n",[59,1601,1603,1606,1609],{"class":61,"line":1602},58,[59,1604,1605],{"class":76},"    id: ",[59,1607,1608],{"class":205},"\"123\"",[59,1610,94],{"class":76},[59,1612,1614,1617,1620],{"class":61,"line":1613},59,[59,1615,1616],{"class":76},"    name: ",[59,1618,1619],{"class":205},"\"Alice\"",[59,1621,94],{"class":76},[59,1623,1625,1628,1631],{"class":61,"line":1624},60,[59,1626,1627],{"class":76},"    displayName: ",[59,1629,1630],{"class":205},"\" Alice \"",[59,1632,94],{"class":76},[59,1634,1636,1639,1642],{"class":61,"line":1635},61,[59,1637,1638],{"class":76},"    email: ",[59,1640,1641],{"class":205},"\"alice@test.com\"",[59,1643,94],{"class":76},[59,1645,1647,1650,1653],{"class":61,"line":1646},62,[59,1648,1649],{"class":76},"    createdAt: ",[59,1651,1652],{"class":205},"\"2023-10-01T12:00:00Z\"",[59,1654,94],{"class":76},[59,1656,1658,1661,1664],{"class":61,"line":1657},63,[59,1659,1660],{"class":76},"    age: ",[59,1662,1663],{"class":90},"30",[59,1665,94],{"class":76},[59,1667,1669,1672,1674],{"class":61,"line":1668},64,[59,1670,1671],{"class":76},"    role: ",[59,1673,1217],{"class":205},[59,1675,94],{"class":76},[59,1677,1679,1682,1685],{"class":61,"line":1678},65,[59,1680,1681],{"class":76},"    password: ",[59,1683,1684],{"class":205},"\"Password1\"",[59,1686,94],{"class":76},[59,1688,1690,1693,1695],{"class":61,"line":1689},66,[59,1691,1692],{"class":76},"    team: ",[59,1694,1339],{"class":205},[59,1696,94],{"class":76},[59,1698,1700,1703,1705,1707],{"class":61,"line":1699},67,[59,1701,1702],{"class":76},"    userRole: ",[59,1704,1217],{"class":205},[59,1706,1220],{"class":76},[59,1708,1709],{"class":300},"// Extra field, ignored by default\n",[59,1711,1713],{"class":61,"line":1712},68,[59,1714,1715],{"class":76},"  },\n",[59,1717,1719],{"class":61,"line":1718},69,[59,1720,1721],{"class":76},"]);\n",[59,1723,1725],{"class":61,"line":1724},70,[59,1726,144],{"emptyLinePlaceholder":143},[59,1728,1730,1732,1734],{"class":61,"line":1729},71,[59,1731,920],{"class":76},[59,1733,852],{"class":69},[59,1735,1736],{"class":76},"(result);\n",[59,1738,1740],{"class":61,"line":1739},72,[59,1741,144],{"emptyLinePlaceholder":143},[59,1743,1745],{"class":61,"line":1744},73,[59,1746,1747],{"class":300},"// Expected output:\n",[59,1749,1751],{"class":61,"line":1750},74,[59,1752,1753],{"class":300},"// [\n",[59,1755,1757],{"class":61,"line":1756},75,[59,1758,1759],{"class":300},"//   {\n",[59,1761,1763],{"class":61,"line":1762},76,[59,1764,1765],{"class":300},"//     id: 123,\n",[59,1767,1769],{"class":61,"line":1768},77,[59,1770,1771],{"class":300},"//     name: 'Alice',\n",[59,1773,1775],{"class":61,"line":1774},78,[59,1776,1777],{"class":300},"//     displayName: 'alice',\n",[59,1779,1781],{"class":61,"line":1780},79,[59,1782,1783],{"class":300},"//     email: 'alice@test.com',\n",[59,1785,1787],{"class":61,"line":1786},80,[59,1788,1789],{"class":300},"//     createdAt: 2023-10-01T12:00:00.000Z,\n",[59,1791,1793],{"class":61,"line":1792},81,[59,1794,1795],{"class":300},"//     age: 30,\n",[59,1797,1799],{"class":61,"line":1798},82,[59,1800,1801],{"class":300},"//     isActive: true,\n",[59,1803,1805],{"class":61,"line":1804},83,[59,1806,1807],{"class":300},"//     role: 'admin',\n",[59,1809,1811],{"class":61,"line":1810},84,[59,1812,1813],{"class":300},"//     password: 'Password1',\n",[59,1815,1817],{"class":61,"line":1816},85,[59,1818,1819],{"class":300},"//     team: 'red'\n",[59,1821,1823],{"class":61,"line":1822},86,[59,1824,1825],{"class":300},"//   }\n",[59,1827,1829],{"class":61,"line":1828},87,[59,1830,1831],{"class":300},"// ]\n",[335,1833,1835,1857],{"title-en":1834,"title-pt":1834},"Extra Keys",[340,1836,1837,1847],{"v-slot:en":54},[30,1838,1839,1840,1843,1844,379],{},"In this example, Zod removed ",[56,1841,1842],{},"userRole",", which is not part of the schema. That is default behavior for ",[56,1845,1846],{},"z.object",[30,1848,1849,1850,1853,1854,379],{},"If you need validation to fail on extra properties, use ",[56,1851,1852],{},"z.strictObject",". If you want to preserve them, use ",[56,1855,1856],{},"z.looseObject",[340,1858,1859,1867],{"v-slot:pt":54},[30,1860,1861,1862,1864,1865],{},"Note que no nosso exemplo, o Zod removeu a propriedade ",[56,1863,1842],{},", que não estava definido no schema. Esse é o comportamento padrão para ",[56,1866,1846],{},[30,1868,1869,1870,1872,1873],{},"Se você precisa que a validação falha quando encontrar uma propriedade extra, você pode utilizar ",[56,1871,1852],{},". Se você deseja manter esses valores, você pode utilizar ",[56,1874,1856],{},[26,1876,1877],{"lang":28},[30,1878,1879],{},"And since we are using TypeScript, we can compose schemas:",[26,1881,1882],{"lang":40},[30,1883,1884],{},"E como estamos utilizando Typescript, também é possível fazer composições:",[49,1886,1888],{"className":51,"code":1887,"language":53,"meta":54,"style":54},"import * as z from \"zod\";\n\n// Reusable schema\nconst DatabaseDates = z.object({\n  created_at: z.date(),\n  updated_at: z.date(),\n});\n\nconst UserSchema = z.object({\n  id: z.uuid(),\n  email: z.email(),\n  name: z.string().min(1).max(100),\n  // `.shape` returns inner object schema\n  ...DatabaseDates.shape,\n});\n\n// Or use .extend()\nconst UserSchemaExtended = z\n  .object({\n    id: z.uuid(),\n    email: z.email(),\n    name: z.string().min(1).max(100),\n  })\n  .extend(DatabaseDates.shape);\n\n// You can also build schema factories\nfunction createTeamsSchema(names: string[]) {\n  return z.object({\n    id: z.uuid(),\n    name: z.enum(names),\n    ...DatabaseDates.shape,\n  });\n}\n\nconst ColorTeams = createTeamsSchema([\"Red Team\", \"Blue Team\", \"Green Team\"]);\n",[56,1889,1890,1906,1910,1915,1930,1940,1949,1953,1957,1972,1981,1989,2013,2018,2026,2030,2034,2039,2051,2060,2069,2078,2103,2108,2118,2122,2127,2147,2157,2165,2174,2181,2186,2190,2194],{"__ignoreMap":54},[59,1891,1892,1894,1896,1898,1900,1902,1904],{"class":61,"line":62},[59,1893,398],{"class":65},[59,1895,401],{"class":90},[59,1897,404],{"class":65},[59,1899,407],{"class":76},[59,1901,410],{"class":65},[59,1903,413],{"class":205},[59,1905,257],{"class":76},[59,1907,1908],{"class":61,"line":80},[59,1909,144],{"emptyLinePlaceholder":143},[59,1911,1912],{"class":61,"line":97},[59,1913,1914],{"class":300},"// Reusable schema\n",[59,1916,1917,1919,1922,1924,1926,1928],{"class":61,"line":109},[59,1918,273],{"class":65},[59,1920,1921],{"class":90}," DatabaseDates",[59,1923,73],{"class":65},[59,1925,430],{"class":76},[59,1927,433],{"class":69},[59,1929,436],{"class":76},[59,1931,1932,1935,1938],{"class":61,"line":122},[59,1933,1934],{"class":76},"  created_at: z.",[59,1936,1937],{"class":69},"date",[59,1939,447],{"class":76},[59,1941,1942,1945,1947],{"class":61,"line":134},[59,1943,1944],{"class":76},"  updated_at: z.",[59,1946,1937],{"class":69},[59,1948,447],{"class":76},[59,1950,1951],{"class":61,"line":140},[59,1952,480],{"class":76},[59,1954,1955],{"class":61,"line":147},[59,1956,144],{"emptyLinePlaceholder":143},[59,1958,1959,1961,1964,1966,1968,1970],{"class":61,"line":186},[59,1960,273],{"class":65},[59,1962,1963],{"class":90}," UserSchema",[59,1965,73],{"class":65},[59,1967,430],{"class":76},[59,1969,433],{"class":69},[59,1971,436],{"class":76},[59,1973,1974,1976,1979],{"class":61,"line":217},[59,1975,452],{"class":76},[59,1977,1978],{"class":69},"uuid",[59,1980,447],{"class":76},[59,1982,1983,1985,1987],{"class":61,"line":238},[59,1984,1110],{"class":76},[59,1986,1113],{"class":69},[59,1988,447],{"class":76},[59,1990,1991,1993,1995,1997,1999,2001,2003,2005,2007,2009,2011],{"class":61,"line":243},[59,1992,1049],{"class":76},[59,1994,464],{"class":69},[59,1996,1054],{"class":76},[59,1998,1057],{"class":69},[59,2000,159],{"class":76},[59,2002,287],{"class":90},[59,2004,1065],{"class":76},[59,2006,1068],{"class":69},[59,2008,159],{"class":76},[59,2010,1073],{"class":90},[59,2012,1076],{"class":76},[59,2014,2015],{"class":61,"line":260},[59,2016,2017],{"class":300},"  // `.shape` returns inner object schema\n",[59,2019,2020,2023],{"class":61,"line":265},[59,2021,2022],{"class":65},"  ...",[59,2024,2025],{"class":76},"DatabaseDates.shape,\n",[59,2027,2028],{"class":61,"line":270},[59,2029,480],{"class":76},[59,2031,2032],{"class":61,"line":292},[59,2033,144],{"emptyLinePlaceholder":143},[59,2035,2036],{"class":61,"line":297},[59,2037,2038],{"class":300},"// Or use .extend()\n",[59,2040,2041,2043,2046,2048],{"class":61,"line":304},[59,2042,273],{"class":65},[59,2044,2045],{"class":90}," UserSchemaExtended",[59,2047,73],{"class":65},[59,2049,2050],{"class":76}," z\n",[59,2052,2053,2056,2058],{"class":61,"line":320},[59,2054,2055],{"class":76},"  .",[59,2057,433],{"class":69},[59,2059,436],{"class":76},[59,2061,2062,2065,2067],{"class":61,"line":618},[59,2063,2064],{"class":76},"    id: z.",[59,2066,1978],{"class":69},[59,2068,447],{"class":76},[59,2070,2071,2074,2076],{"class":61,"line":623},[59,2072,2073],{"class":76},"    email: z.",[59,2075,1113],{"class":69},[59,2077,447],{"class":76},[59,2079,2080,2083,2085,2087,2089,2091,2093,2095,2097,2099,2101],{"class":61,"line":642},[59,2081,2082],{"class":76},"    name: z.",[59,2084,464],{"class":69},[59,2086,1054],{"class":76},[59,2088,1057],{"class":69},[59,2090,159],{"class":76},[59,2092,287],{"class":90},[59,2094,1065],{"class":76},[59,2096,1068],{"class":69},[59,2098,159],{"class":76},[59,2100,1073],{"class":90},[59,2102,1076],{"class":76},[59,2104,2105],{"class":61,"line":647},[59,2106,2107],{"class":76},"  })\n",[59,2109,2110,2112,2115],{"class":61,"line":5},[59,2111,2055],{"class":76},[59,2113,2114],{"class":69},"extend",[59,2116,2117],{"class":76},"(DatabaseDates.shape);\n",[59,2119,2120],{"class":61,"line":1263},[59,2121,144],{"emptyLinePlaceholder":143},[59,2123,2124],{"class":61,"line":1296},[59,2125,2126],{"class":300},"// You can also build schema factories\n",[59,2128,2129,2132,2135,2137,2140,2142,2144],{"class":61,"line":1307},[59,2130,2131],{"class":65},"function",[59,2133,2134],{"class":69}," createTeamsSchema",[59,2136,159],{"class":76},[59,2138,2139],{"class":83},"names",[59,2141,87],{"class":65},[59,2143,117],{"class":90},[59,2145,2146],{"class":76},"[]) {\n",[59,2148,2149,2151,2153,2155],{"class":61,"line":1313},[59,2150,246],{"class":65},[59,2152,430],{"class":76},[59,2154,433],{"class":69},[59,2156,436],{"class":76},[59,2158,2159,2161,2163],{"class":61,"line":1319},[59,2160,2064],{"class":76},[59,2162,1978],{"class":69},[59,2164,447],{"class":76},[59,2166,2167,2169,2171],{"class":61,"line":1362},[59,2168,2082],{"class":76},[59,2170,1211],{"class":69},[59,2172,2173],{"class":76},"(names),\n",[59,2175,2176,2179],{"class":61,"line":1387},[59,2177,2178],{"class":65},"    ...",[59,2180,2025],{"class":76},[59,2182,2183],{"class":61,"line":1408},[59,2184,2185],{"class":76},"  });\n",[59,2187,2188],{"class":61,"line":1417},[59,2189,137],{"class":76},[59,2191,2192],{"class":61,"line":1423},[59,2193,144],{"emptyLinePlaceholder":143},[59,2195,2196,2198,2201,2203,2205,2207,2210,2212,2215,2217,2220],{"class":61,"line":1428},[59,2197,273],{"class":65},[59,2199,2200],{"class":90}," ColorTeams",[59,2202,73],{"class":65},[59,2204,2134],{"class":69},[59,2206,1214],{"class":76},[59,2208,2209],{"class":205},"\"Red Team\"",[59,2211,1220],{"class":76},[59,2213,2214],{"class":205},"\"Blue Team\"",[59,2216,1220],{"class":76},[59,2218,2219],{"class":205},"\"Green Team\"",[59,2221,1721],{"class":76},[26,2223,2224,2227],{"lang":28},[30,2225,2226],{},"Zod lets us build complex validation and transformation flows, extract types, and centralize everything in a single component. Beyond built-in helpers, we can define custom rules and transformations. One of its best advantages is clear error messages showing expected vs received values.",[30,2228,2229,2230,2235],{},"In this article I focused on the most common use case: validating input. But you can also use Zod to build an ",[373,2231,2234],{"href":2232,"rel":2233},"https://learn.microsoft.com/en-us/azure/architecture/patterns/anti-corruption-layer",[377],"Anti-Corruption Layer"," between services and databases, and in more critical contexts, even validate business rules themselves.",[26,2237,2238,2241],{"lang":40},[30,2239,2240],{},"O Zod permite a gente criar validações e transformações complexas, nos dando a opção de extrair os tipos, centralizando tudo em um só componente. Além das muitas funções de validação e transformação disponíveis, temos possibilidade de criar nossas própris funções. Uma das maiores vantagens são as mensagens claras, indicando os valores esperados e os valores recebidos.",[30,2242,2243,2244,2249],{},"Nos meus exemplos, eu mostrei o uso mais comum, validar inputs, mas também é possível explorar o Zod para criar uma ",[373,2245,2248],{"href":2246,"rel":2247},"https://learn.microsoft.com/pt-br/azure/architecture/patterns/anti-corruption-layer",[377],"Camada Anticorrupção"," entre serviços e banco de dados, e em caso muito críticos, podemos utilizar para validar as próprias regras de negócio.",[2251,2252,2253],"style",{},"html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}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 .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);}",{"title":54,"searchDepth":80,"depth":80,"links":2255},[],"How to create robust schemas and types","Como criar schemas e tipos robustos","md",{},"/blog/zod-why-how-when","2025-12-17",{"title":21,"description":54},"zod-why-how-when","blog/zod-why-how-when",[2266,2267,2268],"javascript","typescript","zod","Zod: Why? How? When?","Zod: Por quê? Como? Quando?","jJQfld1nJuC2AbLMfjGO4AcosJMXbr_sJy-1_0Vs9c4",1777685535893]