[{"data":1,"prerenderedAt":345},["ShallowReactive",2],{"snippet-\u002Fsnippets\u002Frecursive-partial-type":3},{"id":4,"title":5,"body":6,"description":335,"draft":336,"extension":337,"lastModified":338,"meta":339,"navigation":155,"path":340,"seo":341,"stem":342,"tags":343,"__hash__":344},"snippets\u002Fsnippets\u002Frecursive-partial-type.md","Recursive Partial Type",{"type":7,"value":8,"toc":332},"minimark",[9,13,96,101,318,328],[10,11,12],"p",{},"Sometimes we would like to derive a deeply nested partial\u002Foptional type from an\nexisting type (without modifying it). This simple type util can come in handy\nfor that:",[14,15,20],"pre",{"className":16,"code":17,"language":18,"meta":19,"style":19},"language-ts shiki shiki-themes github-dark","type RecursivePartial\u003CT> = {\n  [P in keyof T]?: RecursivePartial\u003CT[P]>;\n};\n","ts","",[21,22,23,52,90],"code",{"__ignoreMap":19},[24,25,28,32,36,40,43,46,49],"span",{"class":26,"line":27},"line",1,[24,29,31],{"class":30},"snl16","type",[24,33,35],{"class":34},"svObZ"," RecursivePartial",[24,37,39],{"class":38},"s95oV","\u003C",[24,41,42],{"class":34},"T",[24,44,45],{"class":38},"> ",[24,47,48],{"class":30},"=",[24,50,51],{"class":38}," {\n",[24,53,55,58,61,64,67,70,73,76,78,80,82,85,87],{"class":26,"line":54},2,[24,56,57],{"class":38},"  [",[24,59,60],{"class":34},"P",[24,62,63],{"class":30}," in",[24,65,66],{"class":30}," keyof",[24,68,69],{"class":34}," T",[24,71,72],{"class":38},"]",[24,74,75],{"class":30},"?:",[24,77,35],{"class":34},[24,79,39],{"class":38},[24,81,42],{"class":34},[24,83,84],{"class":38},"[",[24,86,60],{"class":34},[24,88,89],{"class":38},"]>;\n",[24,91,93],{"class":26,"line":92},3,[24,94,95],{"class":38},"};\n",[97,98,100],"h2",{"id":99},"usage","Usage",[14,102,104],{"className":16,"code":103,"language":18,"meta":19,"style":19},"type PointCoord = {\n  x: number;\n  y: number;\n};\n\ntype PointColor = {\n  r: number;\n  g: number;\n  b: number;\n};\n\ntype PointData = {\n  coord: PointCoord;\n  color: PointColor;\n};\n\n\u002F\u002F ❌ Err :( coord, color are partial not it's nested props\ntype partialPoint = Partial\u003CPointData>;\n\n\u002F\u002F ✅ All props including the nested ones like x, y are Partial\ntype nestedPartialPoint = RecursivePartial\u003CPointData>;\n",[21,105,106,118,134,145,150,157,169,181,193,205,210,215,227,239,251,256,261,268,289,294,300],{"__ignoreMap":19},[24,107,108,110,113,116],{"class":26,"line":27},[24,109,31],{"class":30},[24,111,112],{"class":34}," PointCoord",[24,114,115],{"class":30}," =",[24,117,51],{"class":38},[24,119,120,124,127,131],{"class":26,"line":54},[24,121,123],{"class":122},"s9osk","  x",[24,125,126],{"class":30},":",[24,128,130],{"class":129},"sDLfK"," number",[24,132,133],{"class":38},";\n",[24,135,136,139,141,143],{"class":26,"line":92},[24,137,138],{"class":122},"  y",[24,140,126],{"class":30},[24,142,130],{"class":129},[24,144,133],{"class":38},[24,146,148],{"class":26,"line":147},4,[24,149,95],{"class":38},[24,151,153],{"class":26,"line":152},5,[24,154,156],{"emptyLinePlaceholder":155},true,"\n",[24,158,160,162,165,167],{"class":26,"line":159},6,[24,161,31],{"class":30},[24,163,164],{"class":34}," PointColor",[24,166,115],{"class":30},[24,168,51],{"class":38},[24,170,172,175,177,179],{"class":26,"line":171},7,[24,173,174],{"class":122},"  r",[24,176,126],{"class":30},[24,178,130],{"class":129},[24,180,133],{"class":38},[24,182,184,187,189,191],{"class":26,"line":183},8,[24,185,186],{"class":122},"  g",[24,188,126],{"class":30},[24,190,130],{"class":129},[24,192,133],{"class":38},[24,194,196,199,201,203],{"class":26,"line":195},9,[24,197,198],{"class":122},"  b",[24,200,126],{"class":30},[24,202,130],{"class":129},[24,204,133],{"class":38},[24,206,208],{"class":26,"line":207},10,[24,209,95],{"class":38},[24,211,213],{"class":26,"line":212},11,[24,214,156],{"emptyLinePlaceholder":155},[24,216,218,220,223,225],{"class":26,"line":217},12,[24,219,31],{"class":30},[24,221,222],{"class":34}," PointData",[24,224,115],{"class":30},[24,226,51],{"class":38},[24,228,230,233,235,237],{"class":26,"line":229},13,[24,231,232],{"class":122},"  coord",[24,234,126],{"class":30},[24,236,112],{"class":34},[24,238,133],{"class":38},[24,240,242,245,247,249],{"class":26,"line":241},14,[24,243,244],{"class":122},"  color",[24,246,126],{"class":30},[24,248,164],{"class":34},[24,250,133],{"class":38},[24,252,254],{"class":26,"line":253},15,[24,255,95],{"class":38},[24,257,259],{"class":26,"line":258},16,[24,260,156],{"emptyLinePlaceholder":155},[24,262,264],{"class":26,"line":263},17,[24,265,267],{"class":266},"sAwPA","\u002F\u002F ❌ Err :( coord, color are partial not it's nested props\n",[24,269,271,273,276,278,281,283,286],{"class":26,"line":270},18,[24,272,31],{"class":30},[24,274,275],{"class":34}," partialPoint",[24,277,115],{"class":30},[24,279,280],{"class":34}," Partial",[24,282,39],{"class":38},[24,284,285],{"class":34},"PointData",[24,287,288],{"class":38},">;\n",[24,290,292],{"class":26,"line":291},19,[24,293,156],{"emptyLinePlaceholder":155},[24,295,297],{"class":26,"line":296},20,[24,298,299],{"class":266},"\u002F\u002F ✅ All props including the nested ones like x, y are Partial\n",[24,301,303,305,308,310,312,314,316],{"class":26,"line":302},21,[24,304,31],{"class":30},[24,306,307],{"class":34}," nestedPartialPoint",[24,309,115],{"class":30},[24,311,35],{"class":34},[24,313,39],{"class":38},[24,315,285],{"class":34},[24,317,288],{"class":38},[10,319,320,321],{},"Original Source:\n",[322,323,327],"a",{"href":324,"rel":325},"https:\u002F\u002Fstackoverflow.com\u002Fquestions\u002F47914536\u002Fuse-partial-in-nested-property-with-typescript",[326],"nofollow","Stackoverflow",[329,330,331],"style",{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}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 pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":19,"searchDepth":54,"depth":54,"links":333},[334],{"id":99,"depth":54,"text":100},"A TypeScript utility type that makes every property optional at every level of nesting. RecursivePartial maps over the keys and recurses without touching the source.",false,"md","2026-08-29T17:42:32+07:00",{},"\u002Fsnippets\u002Frecursive-partial-type",{"title":5,"description":335},"snippets\u002Frecursive-partial-type","typescript, util, type","53GTr-s93U-NfyletsB8hs9Q5tDqAYprwyaYg2LD-jE",1788101292549]