[{"data":1,"prerenderedAt":2099},["ShallowReactive",2],{"navigation_docs":3,"-guide-validation":127,"-guide-validation-surround":2094},[4,19,53,71,95],{"title":5,"icon":6,"redirect":7,"path":8,"stem":9,"children":10,"page":18},"Introduction","i-lucide-rocket","\u002Fintroduction\u002Fabout-ts-runtypes","\u002Fintroduction","1.introduction",[11,14],{"title":12,"path":7,"stem":13},"About RunTypes","1.introduction\u002F1.about-ts-runtypes",{"title":15,"path":16,"stem":17},"Quick Start","\u002Fintroduction\u002Fquick-start","1.introduction\u002F2.quick-start",false,{"title":20,"icon":21,"redirect":22,"path":23,"stem":24,"children":25,"page":18},"Guide","i-lucide-book-open","\u002Fguide\u002Ftypes-vs-schemas","\u002Fguide","2.guide",[26,29,33,37,41,45,49],{"title":27,"path":22,"stem":28},"Types vs Schemas","2.guide\u002F1.types-vs-schemas",{"title":30,"path":31,"stem":32},"Type Formats","\u002Fguide\u002Ftype-formats","2.guide\u002F2.type-formats",{"title":34,"path":35,"stem":36},"Serialization","\u002Fguide\u002Fserialization","2.guide\u002F3.serialization",{"title":38,"path":39,"stem":40},"Mock Data","\u002Fguide\u002Fmocking","2.guide\u002F4.mocking",{"title":42,"path":43,"stem":44},"Validation","\u002Fguide\u002Fvalidation","2.guide\u002F5.validation",{"title":46,"path":47,"stem":48},"Reflection","\u002Fguide\u002Fmarkers-and-reflection","2.guide\u002F6.markers-and-reflection",{"title":50,"path":51,"stem":52},"Pure Functions","\u002Fguide\u002Fpure-functions","2.guide\u002F7.pure-functions",{"title":54,"icon":55,"redirect":56,"path":57,"stem":58,"children":59,"page":18},"AI Integration","i-lucide-sparkles","\u002Fai-integration\u002Fworkflow-and-commands","\u002Fai-integration","3.ai-integration",[60,63,67],{"title":61,"path":56,"stem":62},"AI Workflow","3.ai-integration\u002F1.workflow-and-commands",{"title":64,"path":65,"stem":66},"FriendlyType","\u002Fai-integration\u002Ffriendly-type","3.ai-integration\u002F2.friendly-type",{"title":68,"path":69,"stem":70},"MockData","\u002Fai-integration\u002Fmock-data","3.ai-integration\u002F3.mock-data",{"title":72,"icon":73,"redirect":74,"path":75,"stem":76,"children":77,"page":18},"Test Suites","i-lucide-terminal","\u002Fsuites\u002Fvalidation","\u002Fsuites","6.suites",[78,80,83,87,91],{"title":42,"path":74,"stem":79},"6.suites\u002F1.validation",{"title":34,"path":81,"stem":82},"\u002Fsuites\u002Fserialization","6.suites\u002F2.serialization",{"title":84,"path":85,"stem":86},"Formats Validation","\u002Fsuites\u002Fformat-validation","6.suites\u002F3.format-validation",{"title":88,"path":89,"stem":90},"Formats Serialization","\u002Fsuites\u002Fformat-serialization","6.suites\u002F4.format-serialization",{"title":92,"path":93,"stem":94},"Fuzzing","\u002Fsuites\u002Ffuzzing","6.suites\u002F5.fuzzing",{"title":96,"icon":97,"redirect":98,"path":99,"stem":100,"children":101,"page":18},"Benchmarks","i-lucide-gauge","\u002Fbenchmarks\u002Fvalidation","\u002Fbenchmarks","7.benchmarks",[102,104,108,112,116,119,123],{"title":42,"path":98,"stem":103},"7.benchmarks\u002F1.validation",{"title":105,"path":106,"stem":107},"Validation Formats","\u002Fbenchmarks\u002Fvalidation-formats","7.benchmarks\u002F2.validation-formats",{"title":109,"path":110,"stem":111},"Validation Errors","\u002Fbenchmarks\u002Fgetvalidationerrors","7.benchmarks\u002F3.getvalidationerrors",{"title":113,"path":114,"stem":115},"Validation Error Formats","\u002Fbenchmarks\u002Fgetvalidationerrors-formats","7.benchmarks\u002F4.getvalidationerrors-formats",{"title":34,"path":117,"stem":118},"\u002Fbenchmarks\u002Fserialization","7.benchmarks\u002F5.serialization",{"title":120,"path":121,"stem":122},"Serialization Formats","\u002Fbenchmarks\u002Fserialization-formats","7.benchmarks\u002F6.serialization-formats",{"title":124,"path":125,"stem":126},"Compile Time","\u002Fbenchmarks\u002Fcompiletime","7.benchmarks\u002F7.compiletime",{"id":128,"title":42,"body":129,"description":2088,"extension":2089,"links":2090,"meta":2091,"navigation":227,"path":43,"seo":2092,"stem":44,"__hash__":2093},"docs\u002F2.guide\u002F5.validation.md",{"type":130,"value":131},"minimark",[132,141,161,166,169,384,421,424,431,440,664,671,682,845,852,859,973,1023,1031,1035,1051,1118,1311,1314,1831,1835,1851,2042,2065,2070,2084],[133,134,135,136,140],"p",{},"Every ",[137,138,139],"code",{},"createX\u003CT>()"," factory turns a type into a purpose-built function the build writes out for you, with no schema object and no runtime reflection. They all share one calling convention and one contract, so once you've seen one you've seen them all.",[133,142,143,144,148,149,152,153,156,157,160],{},"This page covers ",[145,146,147],"strong",{},"validation",": the type guards, the error reports, and unknown-key handling. (",[150,151,34],"a",{"href":35},", ",[150,154,155],{"href":39},"mocking"," and ",[150,158,159],{"href":47},"reflection"," get their own pages.)",[162,163,165],"h2",{"id":164},"three-ways-to-call-any-factory","Three ways to call any factory",[133,167,168],{},"Every factory takes your type three different ways. They all resolve to the same generated function, so use whichever fits the call site.",[170,171,176],"pre",{"className":172,"code":173,"language":174,"meta":175,"style":175},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F 1. Type-first — you supply the type, no value needed.\nconst isPointA = createValidate\u003CPoint>();\n\n\u002F\u002F 2. Value-first — T is inferred from a value you already have.\nconst origin: Point = {x: 0, y: 0};\nconst isPointB = createValidate(origin);\n\n\u002F\u002F 3. Schema-first — pass an RT.* schema; T is inferred from the schema.\nconst pointSchema = RT.object({x: TF.number(), y: TF.number()});\nconst isPointC = createValidate(pointSchema);\n","ts","",[137,177,178,187,222,229,235,278,295,300,306,367],{"__ignoreMap":175},[179,180,183],"span",{"class":181,"line":182},"line",1,[179,184,186],{"class":185},"sHwdD","\u002F\u002F 1. Type-first — you supply the type, no value needed.\n",[179,188,190,194,198,202,206,209,213,216,219],{"class":181,"line":189},2,[179,191,193],{"class":192},"spNyl","const",[179,195,197],{"class":196},"sTEyZ"," isPointA ",[179,199,201],{"class":200},"sMK4o","=",[179,203,205],{"class":204},"s2Zo4"," createValidate",[179,207,208],{"class":200},"\u003C",[179,210,212],{"class":211},"sBMFI","Point",[179,214,215],{"class":200},">",[179,217,218],{"class":196},"()",[179,220,221],{"class":200},";\n",[179,223,225],{"class":181,"line":224},3,[179,226,228],{"emptyLinePlaceholder":227},true,"\n",[179,230,232],{"class":181,"line":231},4,[179,233,234],{"class":185},"\u002F\u002F 2. Value-first — T is inferred from a value you already have.\n",[179,236,238,240,243,246,249,252,255,259,261,265,268,271,273,275],{"class":181,"line":237},5,[179,239,193],{"class":192},[179,241,242],{"class":196}," origin",[179,244,245],{"class":200},":",[179,247,248],{"class":211}," Point",[179,250,251],{"class":200}," =",[179,253,254],{"class":200}," {",[179,256,258],{"class":257},"swJcz","x",[179,260,245],{"class":200},[179,262,264],{"class":263},"sbssI"," 0",[179,266,267],{"class":200},",",[179,269,270],{"class":257}," y",[179,272,245],{"class":200},[179,274,264],{"class":263},[179,276,277],{"class":200},"};\n",[179,279,281,283,286,288,290,293],{"class":181,"line":280},6,[179,282,193],{"class":192},[179,284,285],{"class":196}," isPointB ",[179,287,201],{"class":200},[179,289,205],{"class":204},[179,291,292],{"class":196},"(origin)",[179,294,221],{"class":200},[179,296,298],{"class":181,"line":297},7,[179,299,228],{"emptyLinePlaceholder":227},[179,301,303],{"class":181,"line":302},8,[179,304,305],{"class":185},"\u002F\u002F 3. Schema-first — pass an RT.* schema; T is inferred from the schema.\n",[179,307,309,311,314,316,319,322,325,328,331,333,335,338,340,343,345,347,349,351,353,355,357,359,362,365],{"class":181,"line":308},9,[179,310,193],{"class":192},[179,312,313],{"class":196}," pointSchema ",[179,315,201],{"class":200},[179,317,318],{"class":196}," RT",[179,320,321],{"class":200},".",[179,323,324],{"class":204},"object",[179,326,327],{"class":196},"(",[179,329,330],{"class":200},"{",[179,332,258],{"class":257},[179,334,245],{"class":200},[179,336,337],{"class":196}," TF",[179,339,321],{"class":200},[179,341,342],{"class":204},"number",[179,344,218],{"class":196},[179,346,267],{"class":200},[179,348,270],{"class":257},[179,350,245],{"class":200},[179,352,337],{"class":196},[179,354,321],{"class":200},[179,356,342],{"class":204},[179,358,218],{"class":196},[179,360,361],{"class":200},"}",[179,363,364],{"class":196},")",[179,366,221],{"class":200},[179,368,370,372,375,377,379,382],{"class":181,"line":369},10,[179,371,193],{"class":192},[179,373,374],{"class":196}," isPointC ",[179,376,201],{"class":200},[179,378,205],{"class":204},[179,380,381],{"class":196},"(pointSchema)",[179,383,221],{"class":200},[385,386,387,398,408],"ul",{},[388,389,390,393,394,397],"li",{},[145,391,392],{},"Type-first",": you supply ",[137,395,396],{},"\u003CT>",", no value needed.",[388,399,400,403,404,407],{},[145,401,402],{},"Value-first",": ",[137,405,406],{},"T"," is inferred from a value you already have.",[388,409,410,413,414,417,418,420],{},[145,411,412],{},"Schema-first",": pass an ",[137,415,416],{},"RT.*"," schema; ",[137,419,406],{}," comes from the schema.",[133,422,423],{},"The rest of these guide pages use whichever form reads best for the example, but every one of them accepts all three.",[162,425,427,428],{"id":426},"a-fast-yesno-with-createvalidate","A fast yes\u002Fno with ",[137,429,430],{},"createValidate",[133,432,433,436,437,321],{},[137,434,435],{},"createValidate\u003CT>()"," gives you a type guard: pass a value, get a boolean, and TypeScript narrows the value inside the ",[137,438,439],{},"if",[170,441,443],{"className":172,"code":442,"language":174,"meta":175,"style":175},"\u002F\u002F createValidate -> a type guard. Fast yes\u002Fno.\nconst isUser = createValidate\u003CUser>();\n\nisUser({id: 1, name: 'Ada', roles: ['admin']}); \u002F\u002F true\nisUser({id: '1', name: 'Ada', roles: ['admin']}); \u002F\u002F false — id is not a number\n\n\u002F\u002F It narrows too: inside the `if`, `data` is typed.\nfunction handle(data: unknown) {\n  if (isUser(data)) data.roles; \u002F\u002F ('admin' | 'user')[]\n}\n",[137,444,445,450,472,476,540,596,600,605,629,659],{"__ignoreMap":175},[179,446,447],{"class":181,"line":182},[179,448,449],{"class":185},"\u002F\u002F createValidate -> a type guard. Fast yes\u002Fno.\n",[179,451,452,454,457,459,461,463,466,468,470],{"class":181,"line":189},[179,453,193],{"class":192},[179,455,456],{"class":196}," isUser ",[179,458,201],{"class":200},[179,460,205],{"class":204},[179,462,208],{"class":200},[179,464,465],{"class":211},"User",[179,467,215],{"class":200},[179,469,218],{"class":196},[179,471,221],{"class":200},[179,473,474],{"class":181,"line":224},[179,475,228],{"emptyLinePlaceholder":227},[179,477,478,481,483,485,488,490,493,495,498,500,503,507,510,512,515,517,520,522,525,527,530,532,534,537],{"class":181,"line":231},[179,479,480],{"class":204},"isUser",[179,482,327],{"class":196},[179,484,330],{"class":200},[179,486,487],{"class":257},"id",[179,489,245],{"class":200},[179,491,492],{"class":263}," 1",[179,494,267],{"class":200},[179,496,497],{"class":257}," name",[179,499,245],{"class":200},[179,501,502],{"class":200}," '",[179,504,506],{"class":505},"sfazB","Ada",[179,508,509],{"class":200},"'",[179,511,267],{"class":200},[179,513,514],{"class":257}," roles",[179,516,245],{"class":200},[179,518,519],{"class":196}," [",[179,521,509],{"class":200},[179,523,524],{"class":505},"admin",[179,526,509],{"class":200},[179,528,529],{"class":196},"]",[179,531,361],{"class":200},[179,533,364],{"class":196},[179,535,536],{"class":200},";",[179,538,539],{"class":185}," \u002F\u002F true\n",[179,541,542,544,546,548,550,552,554,557,559,561,563,565,567,569,571,573,575,577,579,581,583,585,587,589,591,593],{"class":181,"line":237},[179,543,480],{"class":204},[179,545,327],{"class":196},[179,547,330],{"class":200},[179,549,487],{"class":257},[179,551,245],{"class":200},[179,553,502],{"class":200},[179,555,556],{"class":505},"1",[179,558,509],{"class":200},[179,560,267],{"class":200},[179,562,497],{"class":257},[179,564,245],{"class":200},[179,566,502],{"class":200},[179,568,506],{"class":505},[179,570,509],{"class":200},[179,572,267],{"class":200},[179,574,514],{"class":257},[179,576,245],{"class":200},[179,578,519],{"class":196},[179,580,509],{"class":200},[179,582,524],{"class":505},[179,584,509],{"class":200},[179,586,529],{"class":196},[179,588,361],{"class":200},[179,590,364],{"class":196},[179,592,536],{"class":200},[179,594,595],{"class":185}," \u002F\u002F false — id is not a number\n",[179,597,598],{"class":181,"line":280},[179,599,228],{"emptyLinePlaceholder":227},[179,601,602],{"class":181,"line":297},[179,603,604],{"class":185},"\u002F\u002F It narrows too: inside the `if`, `data` is typed.\n",[179,606,607,610,613,615,619,621,624,626],{"class":181,"line":302},[179,608,609],{"class":192},"function",[179,611,612],{"class":204}," handle",[179,614,327],{"class":200},[179,616,618],{"class":617},"sHdIc","data",[179,620,245],{"class":200},[179,622,623],{"class":211}," unknown",[179,625,364],{"class":200},[179,627,628],{"class":200}," {\n",[179,630,631,635,638,640,642,644,647,649,651,654,656],{"class":181,"line":308},[179,632,634],{"class":633},"s7zQu","  if",[179,636,637],{"class":257}," (",[179,639,480],{"class":204},[179,641,327],{"class":257},[179,643,618],{"class":196},[179,645,646],{"class":257},")) ",[179,648,618],{"class":196},[179,650,321],{"class":200},[179,652,653],{"class":196},"roles",[179,655,536],{"class":200},[179,657,658],{"class":185}," \u002F\u002F ('admin' | 'user')[]\n",[179,660,661],{"class":181,"line":369},[179,662,663],{"class":200},"}\n",[162,665,667,668],{"id":666},"the-full-story-with-creategetvalidationerrors","The full story with ",[137,669,670],{},"createGetValidationErrors",[133,672,673,674,677,678,681],{},"Same checks, but instead of a boolean you get an array of what failed. Each entry is ",[137,675,676],{},"{path, expected}",": where it broke and what was expected. An empty array means valid; format failures add a ",[137,679,680],{},"format"," detail.",[170,683,685],{"className":172,"code":684,"language":174,"meta":175,"style":175},"\u002F\u002F createGetValidationErrors -> the same checks, but it tells you what broke.\nconst userErrors = createGetValidationErrors\u003CUser>();\n\nuserErrors({id: 1, name: 'Ada', roles: ['admin']}); \u002F\u002F [] — all good\nuserErrors({id: '1', name: 42, roles: ['boss']});\n\u002F\u002F [\n\u002F\u002F   {path: ['id'], expected: 'number'},\n\u002F\u002F   {path: ['name'], expected: 'string'},\n\u002F\u002F   {path: ['roles', 0], expected: \"'admin' | 'user'\"},\n\u002F\u002F ]\n",[137,686,687,692,714,718,770,820,825,830,835,840],{"__ignoreMap":175},[179,688,689],{"class":181,"line":182},[179,690,691],{"class":185},"\u002F\u002F createGetValidationErrors -> the same checks, but it tells you what broke.\n",[179,693,694,696,699,701,704,706,708,710,712],{"class":181,"line":189},[179,695,193],{"class":192},[179,697,698],{"class":196}," userErrors ",[179,700,201],{"class":200},[179,702,703],{"class":204}," createGetValidationErrors",[179,705,208],{"class":200},[179,707,465],{"class":211},[179,709,215],{"class":200},[179,711,218],{"class":196},[179,713,221],{"class":200},[179,715,716],{"class":181,"line":224},[179,717,228],{"emptyLinePlaceholder":227},[179,719,720,723,725,727,729,731,733,735,737,739,741,743,745,747,749,751,753,755,757,759,761,763,765,767],{"class":181,"line":231},[179,721,722],{"class":204},"userErrors",[179,724,327],{"class":196},[179,726,330],{"class":200},[179,728,487],{"class":257},[179,730,245],{"class":200},[179,732,492],{"class":263},[179,734,267],{"class":200},[179,736,497],{"class":257},[179,738,245],{"class":200},[179,740,502],{"class":200},[179,742,506],{"class":505},[179,744,509],{"class":200},[179,746,267],{"class":200},[179,748,514],{"class":257},[179,750,245],{"class":200},[179,752,519],{"class":196},[179,754,509],{"class":200},[179,756,524],{"class":505},[179,758,509],{"class":200},[179,760,529],{"class":196},[179,762,361],{"class":200},[179,764,364],{"class":196},[179,766,536],{"class":200},[179,768,769],{"class":185}," \u002F\u002F [] — all good\n",[179,771,772,774,776,778,780,782,784,786,788,790,792,794,797,799,801,803,805,807,810,812,814,816,818],{"class":181,"line":237},[179,773,722],{"class":204},[179,775,327],{"class":196},[179,777,330],{"class":200},[179,779,487],{"class":257},[179,781,245],{"class":200},[179,783,502],{"class":200},[179,785,556],{"class":505},[179,787,509],{"class":200},[179,789,267],{"class":200},[179,791,497],{"class":257},[179,793,245],{"class":200},[179,795,796],{"class":263}," 42",[179,798,267],{"class":200},[179,800,514],{"class":257},[179,802,245],{"class":200},[179,804,519],{"class":196},[179,806,509],{"class":200},[179,808,809],{"class":505},"boss",[179,811,509],{"class":200},[179,813,529],{"class":196},[179,815,361],{"class":200},[179,817,364],{"class":196},[179,819,221],{"class":200},[179,821,822],{"class":181,"line":280},[179,823,824],{"class":185},"\u002F\u002F [\n",[179,826,827],{"class":181,"line":297},[179,828,829],{"class":185},"\u002F\u002F   {path: ['id'], expected: 'number'},\n",[179,831,832],{"class":181,"line":302},[179,833,834],{"class":185},"\u002F\u002F   {path: ['name'], expected: 'string'},\n",[179,836,837],{"class":181,"line":308},[179,838,839],{"class":185},"\u002F\u002F   {path: ['roles', 0], expected: \"'admin' | 'user'\"},\n",[179,841,842],{"class":181,"line":369},[179,843,844],{"class":185},"\u002F\u002F ]\n",[162,846,848,849],{"id":847},"tuning-with-validateoptions","Tuning with ",[137,850,851],{},"ValidateOptions",[133,853,854,855,858],{},"Both validators take an options object as a ",[145,856,857],{},"literal at the call site",". The build reads the literal and routes you to a specialized variant, so nothing is parsed at runtime.",[170,860,862],{"className":172,"code":861,"language":174,"meta":175,"style":175},"\u002F\u002F Pass an OBJECT LITERAL of options. The build reads the literal and routes\n\u002F\u002F the call to a specialized variant of the validator — nothing is read at runtime.\n\n\u002F\u002F noLiterals: a literal check degrades to its base type\n\u002F\u002F (here 'on' | 'off' becomes \"any string\").\nconst isFlagLoose = createValidate\u003CFlag>({noLiterals: true});\n\n\u002F\u002F noIsArrayCheck: skip the leading Array.isArray() guard on array validators\n\u002F\u002F (handy when you've already proven the value is an array upstream).\nconst isFlagFast = createValidate\u003CFlag>({noIsArrayCheck: true});\n",[137,863,864,869,874,878,883,888,925,929,934,939],{"__ignoreMap":175},[179,865,866],{"class":181,"line":182},[179,867,868],{"class":185},"\u002F\u002F Pass an OBJECT LITERAL of options. The build reads the literal and routes\n",[179,870,871],{"class":181,"line":189},[179,872,873],{"class":185},"\u002F\u002F the call to a specialized variant of the validator — nothing is read at runtime.\n",[179,875,876],{"class":181,"line":224},[179,877,228],{"emptyLinePlaceholder":227},[179,879,880],{"class":181,"line":231},[179,881,882],{"class":185},"\u002F\u002F noLiterals: a literal check degrades to its base type\n",[179,884,885],{"class":181,"line":237},[179,886,887],{"class":185},"\u002F\u002F (here 'on' | 'off' becomes \"any string\").\n",[179,889,890,892,895,897,899,901,904,906,908,910,913,915,919,921,923],{"class":181,"line":280},[179,891,193],{"class":192},[179,893,894],{"class":196}," isFlagLoose ",[179,896,201],{"class":200},[179,898,205],{"class":204},[179,900,208],{"class":200},[179,902,903],{"class":211},"Flag",[179,905,215],{"class":200},[179,907,327],{"class":196},[179,909,330],{"class":200},[179,911,912],{"class":257},"noLiterals",[179,914,245],{"class":200},[179,916,918],{"class":917},"sfNiH"," true",[179,920,361],{"class":200},[179,922,364],{"class":196},[179,924,221],{"class":200},[179,926,927],{"class":181,"line":297},[179,928,228],{"emptyLinePlaceholder":227},[179,930,931],{"class":181,"line":302},[179,932,933],{"class":185},"\u002F\u002F noIsArrayCheck: skip the leading Array.isArray() guard on array validators\n",[179,935,936],{"class":181,"line":308},[179,937,938],{"class":185},"\u002F\u002F (handy when you've already proven the value is an array upstream).\n",[179,940,941,943,946,948,950,952,954,956,958,960,963,965,967,969,971],{"class":181,"line":369},[179,942,193],{"class":192},[179,944,945],{"class":196}," isFlagFast ",[179,947,201],{"class":200},[179,949,205],{"class":204},[179,951,208],{"class":200},[179,953,903],{"class":211},[179,955,215],{"class":200},[179,957,327],{"class":196},[179,959,330],{"class":200},[179,961,962],{"class":257},"noIsArrayCheck",[179,964,245],{"class":200},[179,966,918],{"class":917},[179,968,361],{"class":200},[179,970,364],{"class":196},[179,972,221],{"class":200},[974,975,976,989],"table",{},[977,978,979],"thead",{},[980,981,982,986],"tr",{},[983,984,985],"th",{},"Option",[983,987,988],{},"What it does",[990,991,992,1010],"tbody",{},[980,993,994,999],{},[995,996,997],"td",{},[137,998,912],{},[995,1000,1001,1002,1005,1006,1009],{},"Literal checks degrade to their base type, so ",[137,1003,1004],{},"literal 'a'"," accepts any string and ",[137,1007,1008],{},"literal 2"," accepts any finite number.",[980,1011,1012,1016],{},[995,1013,1014],{},[137,1015,962],{},[995,1017,1018,1019,1022],{},"Skips the leading ",[137,1020,1021],{},"Array.isArray()"," guard on array validators, for when you've already proven the value is an array upstream.",[1024,1025,1026,1027,1030],"warning",{},"Pass the options as an ",[145,1028,1029],{},"object literal"," at the call site. It's read at build time, so a variable won't work because the build can't see its value.",[162,1032,1034],{"id":1033},"unknown-keys","Unknown keys",[133,1036,1037,1038,1042,1043,1046,1047,1050],{},"Four tools for properties that aren't in your declared type. These check for ",[1039,1040,1041],"em",{},"extra"," keys. To check that the ",[1039,1044,1045],{},"declared"," keys hold the ",[1039,1048,1049],{},"right types",", that's validation above.",[974,1052,1053,1062],{},[977,1054,1055],{},[980,1056,1057,1060],{},[983,1058,1059],{},"Factory",[983,1061,988],{},[990,1063,1064,1078,1088,1104],{},[980,1065,1066,1071],{},[995,1067,1068],{},[137,1069,1070],{},"createHasUnknownKeys",[995,1072,1073,1074,1077],{},"Predicate that returns ",[137,1075,1076],{},"true"," if the value carries any undeclared key.",[980,1079,1080,1085],{},[995,1081,1082],{},[137,1083,1084],{},"createStripUnknownKeys",[995,1086,1087],{},"Deletes undeclared keys in place, returns the same reference.",[980,1089,1090,1095],{},[995,1091,1092],{},[137,1093,1094],{},"createUnknownKeyErrors",[995,1096,1097,1098,1101,1102,321],{},"One ",[137,1099,1100],{},"{path, expected: 'never'}"," per undeclared key, the same shape as ",[137,1103,670],{},[980,1105,1106,1111],{},[995,1107,1108],{},[137,1109,1110],{},"createUnknownKeysToUndefined",[995,1112,1113,1114,1117],{},"Keeps the key but sets it to ",[137,1115,1116],{},"undefined"," instead of deleting it.",[170,1119,1121],{"className":172,"code":1120,"language":174,"meta":175,"style":175},"import {createHasUnknownKeys} from 'ts-runtypes';\n\ntype User = {id: number; name: string};\n\n\u002F\u002F createHasUnknownKeys -> true if the value carries any key the type didn't declare.\nconst hasExtra = createHasUnknownKeys\u003CUser>();\n\nhasExtra({id: 1, name: 'Ada'}); \u002F\u002F false\nhasExtra({id: 1, name: 'Ada', admin: true}); \u002F\u002F true — `admin` isn't in User\n\nexport {hasExtra};\n",[137,1122,1123,1146,1150,1180,1184,1189,1211,1215,1251,1295,1299],{"__ignoreMap":175},[179,1124,1125,1128,1130,1132,1134,1137,1139,1142,1144],{"class":181,"line":182},[179,1126,1127],{"class":633},"import",[179,1129,254],{"class":200},[179,1131,1070],{"class":196},[179,1133,361],{"class":200},[179,1135,1136],{"class":633}," from",[179,1138,502],{"class":200},[179,1140,1141],{"class":505},"ts-runtypes",[179,1143,509],{"class":200},[179,1145,221],{"class":200},[179,1147,1148],{"class":181,"line":189},[179,1149,228],{"emptyLinePlaceholder":227},[179,1151,1152,1155,1158,1160,1162,1164,1166,1169,1171,1173,1175,1178],{"class":181,"line":224},[179,1153,1154],{"class":192},"type",[179,1156,1157],{"class":211}," User",[179,1159,251],{"class":200},[179,1161,254],{"class":200},[179,1163,487],{"class":257},[179,1165,245],{"class":200},[179,1167,1168],{"class":211}," number",[179,1170,536],{"class":200},[179,1172,497],{"class":257},[179,1174,245],{"class":200},[179,1176,1177],{"class":211}," string",[179,1179,277],{"class":200},[179,1181,1182],{"class":181,"line":231},[179,1183,228],{"emptyLinePlaceholder":227},[179,1185,1186],{"class":181,"line":237},[179,1187,1188],{"class":185},"\u002F\u002F createHasUnknownKeys -> true if the value carries any key the type didn't declare.\n",[179,1190,1191,1193,1196,1198,1201,1203,1205,1207,1209],{"class":181,"line":280},[179,1192,193],{"class":192},[179,1194,1195],{"class":196}," hasExtra ",[179,1197,201],{"class":200},[179,1199,1200],{"class":204}," createHasUnknownKeys",[179,1202,208],{"class":200},[179,1204,465],{"class":211},[179,1206,215],{"class":200},[179,1208,218],{"class":196},[179,1210,221],{"class":200},[179,1212,1213],{"class":181,"line":297},[179,1214,228],{"emptyLinePlaceholder":227},[179,1216,1217,1220,1222,1224,1226,1228,1230,1232,1234,1236,1238,1240,1242,1244,1246,1248],{"class":181,"line":302},[179,1218,1219],{"class":204},"hasExtra",[179,1221,327],{"class":196},[179,1223,330],{"class":200},[179,1225,487],{"class":257},[179,1227,245],{"class":200},[179,1229,492],{"class":263},[179,1231,267],{"class":200},[179,1233,497],{"class":257},[179,1235,245],{"class":200},[179,1237,502],{"class":200},[179,1239,506],{"class":505},[179,1241,509],{"class":200},[179,1243,361],{"class":200},[179,1245,364],{"class":196},[179,1247,536],{"class":200},[179,1249,1250],{"class":185}," \u002F\u002F false\n",[179,1252,1253,1255,1257,1259,1261,1263,1265,1267,1269,1271,1273,1275,1277,1279,1282,1284,1286,1288,1290,1292],{"class":181,"line":308},[179,1254,1219],{"class":204},[179,1256,327],{"class":196},[179,1258,330],{"class":200},[179,1260,487],{"class":257},[179,1262,245],{"class":200},[179,1264,492],{"class":263},[179,1266,267],{"class":200},[179,1268,497],{"class":257},[179,1270,245],{"class":200},[179,1272,502],{"class":200},[179,1274,506],{"class":505},[179,1276,509],{"class":200},[179,1278,267],{"class":200},[179,1280,1281],{"class":257}," admin",[179,1283,245],{"class":200},[179,1285,918],{"class":917},[179,1287,361],{"class":200},[179,1289,364],{"class":196},[179,1291,536],{"class":200},[179,1293,1294],{"class":185}," \u002F\u002F true — `admin` isn't in User\n",[179,1296,1297],{"class":181,"line":369},[179,1298,228],{"emptyLinePlaceholder":227},[179,1300,1302,1305,1307,1309],{"class":181,"line":1301},11,[179,1303,1304],{"class":633},"export",[179,1306,254],{"class":200},[179,1308,1219],{"class":196},[179,1310,277],{"class":200},[133,1312,1313],{},"Strip, report and blank-out share the same shape. Pick the one that matches what downstream code expects:",[1315,1316,1317,1487,1674],"code-group",{},[170,1318,1321],{"className":172,"code":1319,"filename":1320,"language":174,"meta":175,"style":175},"import {createStripUnknownKeys} from 'ts-runtypes';\n\ntype User = {id: number; name: string};\n\n\u002F\u002F createStripUnknownKeys -> deletes undeclared keys in place, returns the same ref.\nconst strip = createStripUnknownKeys\u003CUser>();\n\nconst dirty = {id: 1, name: 'Ada', admin: true, token: 'secret'};\nstrip(dirty); \u002F\u002F {id: 1, name: 'Ada'} — admin and token are gone\n\nexport {strip};\n","strip",[137,1322,1323,1343,1347,1373,1377,1382,1404,1408,1461,1473,1477],{"__ignoreMap":175},[179,1324,1325,1327,1329,1331,1333,1335,1337,1339,1341],{"class":181,"line":182},[179,1326,1127],{"class":633},[179,1328,254],{"class":200},[179,1330,1084],{"class":196},[179,1332,361],{"class":200},[179,1334,1136],{"class":633},[179,1336,502],{"class":200},[179,1338,1141],{"class":505},[179,1340,509],{"class":200},[179,1342,221],{"class":200},[179,1344,1345],{"class":181,"line":189},[179,1346,228],{"emptyLinePlaceholder":227},[179,1348,1349,1351,1353,1355,1357,1359,1361,1363,1365,1367,1369,1371],{"class":181,"line":224},[179,1350,1154],{"class":192},[179,1352,1157],{"class":211},[179,1354,251],{"class":200},[179,1356,254],{"class":200},[179,1358,487],{"class":257},[179,1360,245],{"class":200},[179,1362,1168],{"class":211},[179,1364,536],{"class":200},[179,1366,497],{"class":257},[179,1368,245],{"class":200},[179,1370,1177],{"class":211},[179,1372,277],{"class":200},[179,1374,1375],{"class":181,"line":231},[179,1376,228],{"emptyLinePlaceholder":227},[179,1378,1379],{"class":181,"line":237},[179,1380,1381],{"class":185},"\u002F\u002F createStripUnknownKeys -> deletes undeclared keys in place, returns the same ref.\n",[179,1383,1384,1386,1389,1391,1394,1396,1398,1400,1402],{"class":181,"line":280},[179,1385,193],{"class":192},[179,1387,1388],{"class":196}," strip ",[179,1390,201],{"class":200},[179,1392,1393],{"class":204}," createStripUnknownKeys",[179,1395,208],{"class":200},[179,1397,465],{"class":211},[179,1399,215],{"class":200},[179,1401,218],{"class":196},[179,1403,221],{"class":200},[179,1405,1406],{"class":181,"line":297},[179,1407,228],{"emptyLinePlaceholder":227},[179,1409,1410,1412,1415,1417,1419,1421,1423,1425,1427,1429,1431,1433,1435,1437,1439,1441,1443,1445,1447,1450,1452,1454,1457,1459],{"class":181,"line":302},[179,1411,193],{"class":192},[179,1413,1414],{"class":196}," dirty ",[179,1416,201],{"class":200},[179,1418,254],{"class":200},[179,1420,487],{"class":257},[179,1422,245],{"class":200},[179,1424,492],{"class":263},[179,1426,267],{"class":200},[179,1428,497],{"class":257},[179,1430,245],{"class":200},[179,1432,502],{"class":200},[179,1434,506],{"class":505},[179,1436,509],{"class":200},[179,1438,267],{"class":200},[179,1440,1281],{"class":257},[179,1442,245],{"class":200},[179,1444,918],{"class":917},[179,1446,267],{"class":200},[179,1448,1449],{"class":257}," token",[179,1451,245],{"class":200},[179,1453,502],{"class":200},[179,1455,1456],{"class":505},"secret",[179,1458,509],{"class":200},[179,1460,277],{"class":200},[179,1462,1463,1465,1468,1470],{"class":181,"line":308},[179,1464,1320],{"class":204},[179,1466,1467],{"class":196},"(dirty)",[179,1469,536],{"class":200},[179,1471,1472],{"class":185}," \u002F\u002F {id: 1, name: 'Ada'} — admin and token are gone\n",[179,1474,1475],{"class":181,"line":369},[179,1476,228],{"emptyLinePlaceholder":227},[179,1478,1479,1481,1483,1485],{"class":181,"line":1301},[179,1480,1304],{"class":633},[179,1482,254],{"class":200},[179,1484,1320],{"class":196},[179,1486,277],{"class":200},[170,1488,1491],{"className":172,"code":1489,"filename":1490,"language":174,"meta":175,"style":175},"import {createUnknownKeyErrors} from 'ts-runtypes';\n\ntype User = {id: number; name: string};\n\n\u002F\u002F createUnknownKeyErrors -> one {path, expected: 'never'} entry per undeclared key.\nconst unknownKeyErrors = createUnknownKeyErrors\u003CUser>();\n\nunknownKeyErrors({id: 1, name: 'Ada'}); \u002F\u002F []\nunknownKeyErrors({id: 1, name: 'Ada', admin: true});\n\u002F\u002F [{path: ['admin'], expected: 'never'}]\n\nexport {unknownKeyErrors};\n","report",[137,1492,1493,1513,1517,1543,1547,1552,1574,1578,1614,1654,1659,1663],{"__ignoreMap":175},[179,1494,1495,1497,1499,1501,1503,1505,1507,1509,1511],{"class":181,"line":182},[179,1496,1127],{"class":633},[179,1498,254],{"class":200},[179,1500,1094],{"class":196},[179,1502,361],{"class":200},[179,1504,1136],{"class":633},[179,1506,502],{"class":200},[179,1508,1141],{"class":505},[179,1510,509],{"class":200},[179,1512,221],{"class":200},[179,1514,1515],{"class":181,"line":189},[179,1516,228],{"emptyLinePlaceholder":227},[179,1518,1519,1521,1523,1525,1527,1529,1531,1533,1535,1537,1539,1541],{"class":181,"line":224},[179,1520,1154],{"class":192},[179,1522,1157],{"class":211},[179,1524,251],{"class":200},[179,1526,254],{"class":200},[179,1528,487],{"class":257},[179,1530,245],{"class":200},[179,1532,1168],{"class":211},[179,1534,536],{"class":200},[179,1536,497],{"class":257},[179,1538,245],{"class":200},[179,1540,1177],{"class":211},[179,1542,277],{"class":200},[179,1544,1545],{"class":181,"line":231},[179,1546,228],{"emptyLinePlaceholder":227},[179,1548,1549],{"class":181,"line":237},[179,1550,1551],{"class":185},"\u002F\u002F createUnknownKeyErrors -> one {path, expected: 'never'} entry per undeclared key.\n",[179,1553,1554,1556,1559,1561,1564,1566,1568,1570,1572],{"class":181,"line":280},[179,1555,193],{"class":192},[179,1557,1558],{"class":196}," unknownKeyErrors ",[179,1560,201],{"class":200},[179,1562,1563],{"class":204}," createUnknownKeyErrors",[179,1565,208],{"class":200},[179,1567,465],{"class":211},[179,1569,215],{"class":200},[179,1571,218],{"class":196},[179,1573,221],{"class":200},[179,1575,1576],{"class":181,"line":297},[179,1577,228],{"emptyLinePlaceholder":227},[179,1579,1580,1583,1585,1587,1589,1591,1593,1595,1597,1599,1601,1603,1605,1607,1609,1611],{"class":181,"line":302},[179,1581,1582],{"class":204},"unknownKeyErrors",[179,1584,327],{"class":196},[179,1586,330],{"class":200},[179,1588,487],{"class":257},[179,1590,245],{"class":200},[179,1592,492],{"class":263},[179,1594,267],{"class":200},[179,1596,497],{"class":257},[179,1598,245],{"class":200},[179,1600,502],{"class":200},[179,1602,506],{"class":505},[179,1604,509],{"class":200},[179,1606,361],{"class":200},[179,1608,364],{"class":196},[179,1610,536],{"class":200},[179,1612,1613],{"class":185}," \u002F\u002F []\n",[179,1615,1616,1618,1620,1622,1624,1626,1628,1630,1632,1634,1636,1638,1640,1642,1644,1646,1648,1650,1652],{"class":181,"line":308},[179,1617,1582],{"class":204},[179,1619,327],{"class":196},[179,1621,330],{"class":200},[179,1623,487],{"class":257},[179,1625,245],{"class":200},[179,1627,492],{"class":263},[179,1629,267],{"class":200},[179,1631,497],{"class":257},[179,1633,245],{"class":200},[179,1635,502],{"class":200},[179,1637,506],{"class":505},[179,1639,509],{"class":200},[179,1641,267],{"class":200},[179,1643,1281],{"class":257},[179,1645,245],{"class":200},[179,1647,918],{"class":917},[179,1649,361],{"class":200},[179,1651,364],{"class":196},[179,1653,221],{"class":200},[179,1655,1656],{"class":181,"line":369},[179,1657,1658],{"class":185},"\u002F\u002F [{path: ['admin'], expected: 'never'}]\n",[179,1660,1661],{"class":181,"line":1301},[179,1662,228],{"emptyLinePlaceholder":227},[179,1664,1666,1668,1670,1672],{"class":181,"line":1665},12,[179,1667,1304],{"class":633},[179,1669,254],{"class":200},[179,1671,1582],{"class":196},[179,1673,277],{"class":200},[170,1675,1678],{"className":172,"code":1676,"filename":1677,"language":174,"meta":175,"style":175},"import {createUnknownKeysToUndefined} from 'ts-runtypes';\n\ntype User = {id: number; name: string};\n\n\u002F\u002F createUnknownKeysToUndefined -> sets undeclared keys to undefined instead of deleting.\nconst blank = createUnknownKeysToUndefined\u003CUser>();\n\nconst value = {id: 1, name: 'Ada', admin: true};\nblank(value); \u002F\u002F {id: 1, name: 'Ada', admin: undefined} — key stays, value cleared\n\nexport {blank};\n","blank out",[137,1679,1680,1700,1704,1730,1734,1739,1761,1765,1804,1817,1821],{"__ignoreMap":175},[179,1681,1682,1684,1686,1688,1690,1692,1694,1696,1698],{"class":181,"line":182},[179,1683,1127],{"class":633},[179,1685,254],{"class":200},[179,1687,1110],{"class":196},[179,1689,361],{"class":200},[179,1691,1136],{"class":633},[179,1693,502],{"class":200},[179,1695,1141],{"class":505},[179,1697,509],{"class":200},[179,1699,221],{"class":200},[179,1701,1702],{"class":181,"line":189},[179,1703,228],{"emptyLinePlaceholder":227},[179,1705,1706,1708,1710,1712,1714,1716,1718,1720,1722,1724,1726,1728],{"class":181,"line":224},[179,1707,1154],{"class":192},[179,1709,1157],{"class":211},[179,1711,251],{"class":200},[179,1713,254],{"class":200},[179,1715,487],{"class":257},[179,1717,245],{"class":200},[179,1719,1168],{"class":211},[179,1721,536],{"class":200},[179,1723,497],{"class":257},[179,1725,245],{"class":200},[179,1727,1177],{"class":211},[179,1729,277],{"class":200},[179,1731,1732],{"class":181,"line":231},[179,1733,228],{"emptyLinePlaceholder":227},[179,1735,1736],{"class":181,"line":237},[179,1737,1738],{"class":185},"\u002F\u002F createUnknownKeysToUndefined -> sets undeclared keys to undefined instead of deleting.\n",[179,1740,1741,1743,1746,1748,1751,1753,1755,1757,1759],{"class":181,"line":280},[179,1742,193],{"class":192},[179,1744,1745],{"class":196}," blank ",[179,1747,201],{"class":200},[179,1749,1750],{"class":204}," createUnknownKeysToUndefined",[179,1752,208],{"class":200},[179,1754,465],{"class":211},[179,1756,215],{"class":200},[179,1758,218],{"class":196},[179,1760,221],{"class":200},[179,1762,1763],{"class":181,"line":297},[179,1764,228],{"emptyLinePlaceholder":227},[179,1766,1767,1769,1772,1774,1776,1778,1780,1782,1784,1786,1788,1790,1792,1794,1796,1798,1800,1802],{"class":181,"line":302},[179,1768,193],{"class":192},[179,1770,1771],{"class":196}," value ",[179,1773,201],{"class":200},[179,1775,254],{"class":200},[179,1777,487],{"class":257},[179,1779,245],{"class":200},[179,1781,492],{"class":263},[179,1783,267],{"class":200},[179,1785,497],{"class":257},[179,1787,245],{"class":200},[179,1789,502],{"class":200},[179,1791,506],{"class":505},[179,1793,509],{"class":200},[179,1795,267],{"class":200},[179,1797,1281],{"class":257},[179,1799,245],{"class":200},[179,1801,918],{"class":917},[179,1803,277],{"class":200},[179,1805,1806,1809,1812,1814],{"class":181,"line":308},[179,1807,1808],{"class":204},"blank",[179,1810,1811],{"class":196},"(value)",[179,1813,536],{"class":200},[179,1815,1816],{"class":185}," \u002F\u002F {id: 1, name: 'Ada', admin: undefined} — key stays, value cleared\n",[179,1818,1819],{"class":181,"line":369},[179,1820,228],{"emptyLinePlaceholder":227},[179,1822,1823,1825,1827,1829],{"class":181,"line":1301},[179,1824,1304],{"class":633},[179,1826,254],{"class":200},[179,1828,1808],{"class":196},[179,1830,277],{"class":200},[162,1832,1834],{"id":1833},"standard-schema","Standard Schema",[133,1836,1837,1840,1841,1846,1847,1850],{},[137,1838,1839],{},"createStandardSchema\u003CT>()"," wraps the validators above into a ",[150,1842,1834],{"href":1843,"rel":1844},"https:\u002F\u002Fgithub.com\u002Fstandard-schema\u002Fstandard-schema",[1845],"nofollow"," object: the shared ",[137,1848,1849],{},"~standard"," contract that tRPC, TanStack Form and Router, Hono, React Hook Form and many more accept directly. One call and your type works anywhere the spec is understood, with no per-library adapter to write.",[170,1852,1854],{"className":172,"code":1853,"language":174,"meta":175,"style":175},"\u002F\u002F createStandardSchema -> a Standard Schema v1 object: a single `~standard`\n\u002F\u002F property that tRPC, TanStack Form\u002FRouter, Hono and others accept directly.\nconst userSchema = createStandardSchema\u003CUser>();\n\n\u002F\u002F Valid input comes back under `value`.\nuserSchema['~standard'].validate({id: 1, name: 'Ada', roles: ['admin']});\n\u002F\u002F {value: {id: 1, name: 'Ada', roles: ['admin']}}\n\n\u002F\u002F Invalid input comes back as a flat list of issues, each with a message + path.\nuserSchema['~standard'].validate({id: '1', name: 'Ada', roles: ['admin']});\n\u002F\u002F {issues: [{message: 'Expected number', path: ['id']}]}\n",[137,1855,1856,1861,1866,1888,1892,1897,1959,1964,1968,1973,2037],{"__ignoreMap":175},[179,1857,1858],{"class":181,"line":182},[179,1859,1860],{"class":185},"\u002F\u002F createStandardSchema -> a Standard Schema v1 object: a single `~standard`\n",[179,1862,1863],{"class":181,"line":189},[179,1864,1865],{"class":185},"\u002F\u002F property that tRPC, TanStack Form\u002FRouter, Hono and others accept directly.\n",[179,1867,1868,1870,1873,1875,1878,1880,1882,1884,1886],{"class":181,"line":224},[179,1869,193],{"class":192},[179,1871,1872],{"class":196}," userSchema ",[179,1874,201],{"class":200},[179,1876,1877],{"class":204}," createStandardSchema",[179,1879,208],{"class":200},[179,1881,465],{"class":211},[179,1883,215],{"class":200},[179,1885,218],{"class":196},[179,1887,221],{"class":200},[179,1889,1890],{"class":181,"line":231},[179,1891,228],{"emptyLinePlaceholder":227},[179,1893,1894],{"class":181,"line":237},[179,1895,1896],{"class":185},"\u002F\u002F Valid input comes back under `value`.\n",[179,1898,1899,1902,1904,1906,1908,1910,1912,1915,1917,1919,1921,1923,1925,1927,1929,1931,1933,1935,1937,1939,1941,1943,1945,1947,1949,1951,1953,1955,1957],{"class":181,"line":280},[179,1900,1901],{"class":196},"userSchema[",[179,1903,509],{"class":200},[179,1905,1849],{"class":505},[179,1907,509],{"class":200},[179,1909,529],{"class":196},[179,1911,321],{"class":200},[179,1913,1914],{"class":204},"validate",[179,1916,327],{"class":196},[179,1918,330],{"class":200},[179,1920,487],{"class":257},[179,1922,245],{"class":200},[179,1924,492],{"class":263},[179,1926,267],{"class":200},[179,1928,497],{"class":257},[179,1930,245],{"class":200},[179,1932,502],{"class":200},[179,1934,506],{"class":505},[179,1936,509],{"class":200},[179,1938,267],{"class":200},[179,1940,514],{"class":257},[179,1942,245],{"class":200},[179,1944,519],{"class":196},[179,1946,509],{"class":200},[179,1948,524],{"class":505},[179,1950,509],{"class":200},[179,1952,529],{"class":196},[179,1954,361],{"class":200},[179,1956,364],{"class":196},[179,1958,221],{"class":200},[179,1960,1961],{"class":181,"line":297},[179,1962,1963],{"class":185},"\u002F\u002F {value: {id: 1, name: 'Ada', roles: ['admin']}}\n",[179,1965,1966],{"class":181,"line":302},[179,1967,228],{"emptyLinePlaceholder":227},[179,1969,1970],{"class":181,"line":308},[179,1971,1972],{"class":185},"\u002F\u002F Invalid input comes back as a flat list of issues, each with a message + path.\n",[179,1974,1975,1977,1979,1981,1983,1985,1987,1989,1991,1993,1995,1997,1999,2001,2003,2005,2007,2009,2011,2013,2015,2017,2019,2021,2023,2025,2027,2029,2031,2033,2035],{"class":181,"line":369},[179,1976,1901],{"class":196},[179,1978,509],{"class":200},[179,1980,1849],{"class":505},[179,1982,509],{"class":200},[179,1984,529],{"class":196},[179,1986,321],{"class":200},[179,1988,1914],{"class":204},[179,1990,327],{"class":196},[179,1992,330],{"class":200},[179,1994,487],{"class":257},[179,1996,245],{"class":200},[179,1998,502],{"class":200},[179,2000,556],{"class":505},[179,2002,509],{"class":200},[179,2004,267],{"class":200},[179,2006,497],{"class":257},[179,2008,245],{"class":200},[179,2010,502],{"class":200},[179,2012,506],{"class":505},[179,2014,509],{"class":200},[179,2016,267],{"class":200},[179,2018,514],{"class":257},[179,2020,245],{"class":200},[179,2022,519],{"class":196},[179,2024,509],{"class":200},[179,2026,524],{"class":505},[179,2028,509],{"class":200},[179,2030,529],{"class":196},[179,2032,361],{"class":200},[179,2034,364],{"class":196},[179,2036,221],{"class":200},[179,2038,2039],{"class":181,"line":1301},[179,2040,2041],{"class":185},"\u002F\u002F {issues: [{message: 'Expected number', path: ['id']}]}\n",[133,2043,2044,2045,2048,2049,2052,2053,2056,2057,2060,2061,2064],{},"The object exposes a single ",[137,2046,2047],{},"validate(value)",". It returns ",[137,2050,2051],{},"{value}"," when the value is valid, or ",[137,2054,2055],{},"{issues}"," when it is not, where each issue carries a ",[137,2058,2059],{},"message"," and a ",[137,2062,2063],{},"path"," locating the field that failed. Under the hood it runs the fast type guard first and only builds the issue list on a failure, so the valid path stays cheap.",[133,2066,2067,2068,321],{},"It takes the same three call forms as every other factory (type-first, value-first, schema-first) and the same ",[137,2069,851],{},[2071,2072,2073,2075,2076,2079,2080,2083],"note",{},[137,2074,1914],{}," is synchronous and never throws on invalid input. Instead it reports through ",[137,2077,2078],{},"issues",". The result is typed as ",[137,2081,2082],{},"DataOnly\u003CT>"," (the serializable projection covered above), so what a consumer reads back matches what the validator actually checks.",[2085,2086,2087],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}","Type guards and error reports generated from your type at build time.","md",null,{"toc":18},{"title":42,"description":2088},"VErkPboKBjPmgR4Coq9bCQWCYA88VQhEX8ma_vouo8I",[2095,2097],{"title":38,"path":39,"stem":40,"description":2096,"children":-1},"Generate valid, type-shaped fake data for tests and fixtures.",{"title":46,"path":47,"stem":48,"description":2098,"children":-1},"The one marker you'll actually type, for wrapping your own helpers.",1781995977194]