[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-typescript-tips":3},{"id":4,"title":5,"body":6,"date":445,"description":446,"draft":447,"extension":448,"featured":447,"image":449,"meta":450,"navigation":73,"path":451,"seo":452,"stem":453,"tags":454,"__hash__":458},"blog\u002Fblog\u002Ftypescript-tips.md","TypeScript 实用技巧",{"type":7,"value":8,"toc":436},"minimark",[9,13,17,98,101,106,216,220,291,294,426,429,432],[10,11,12],"h2",{"id":12},"善用类型推导",[14,15,16],"p",{},"TypeScript 能自动推导大多数场景，不必过度声明类型：",[18,19,24],"pre",{"className":20,"code":21,"language":22,"meta":23,"style":23},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F ❌ 多余的声明\nconst name: string = 'hello'\n\n\u002F\u002F ✅ 自动推导\nconst name = 'hello'\n","ts","",[25,26,27,36,68,75,81],"code",{"__ignoreMap":23},[28,29,32],"span",{"class":30,"line":31},"line",1,[28,33,35],{"class":34},"sHwdD","\u002F\u002F ❌ 多余的声明\n",[28,37,39,43,47,51,55,58,61,65],{"class":30,"line":38},2,[28,40,42],{"class":41},"spNyl","const",[28,44,46],{"class":45},"sTEyZ"," name",[28,48,50],{"class":49},"sMK4o",":",[28,52,54],{"class":53},"sBMFI"," string",[28,56,57],{"class":49}," =",[28,59,60],{"class":49}," '",[28,62,64],{"class":63},"sfazB","hello",[28,66,67],{"class":49},"'\n",[28,69,71],{"class":30,"line":70},3,[28,72,74],{"emptyLinePlaceholder":73},true,"\n",[28,76,78],{"class":30,"line":77},4,[28,79,80],{"class":34},"\u002F\u002F ✅ 自动推导\n",[28,82,84,86,89,92,94,96],{"class":30,"line":83},5,[28,85,42],{"class":41},[28,87,88],{"class":45}," name ",[28,90,91],{"class":49},"=",[28,93,60],{"class":49},[28,95,64],{"class":63},[28,97,67],{"class":49},[10,99,100],{"id":100},"工具类型",[102,103,105],"h3",{"id":104},"partialt","Partial\u003CT>",[18,107,109],{"className":20,"code":108,"language":22,"meta":23,"style":23},"interface User {\n  name: string\n  age: number\n  email: string\n}\n\nfunction updateUser(id: string, patch: Partial\u003CUser>) {\n  \u002F\u002F patch 的所有字段都是可选的\n}\n",[25,110,111,122,133,143,152,157,162,205,211],{"__ignoreMap":23},[28,112,113,116,119],{"class":30,"line":31},[28,114,115],{"class":41},"interface",[28,117,118],{"class":53}," User",[28,120,121],{"class":49}," {\n",[28,123,124,128,130],{"class":30,"line":38},[28,125,127],{"class":126},"swJcz","  name",[28,129,50],{"class":49},[28,131,132],{"class":53}," string\n",[28,134,135,138,140],{"class":30,"line":70},[28,136,137],{"class":126},"  age",[28,139,50],{"class":49},[28,141,142],{"class":53}," number\n",[28,144,145,148,150],{"class":30,"line":77},[28,146,147],{"class":126},"  email",[28,149,50],{"class":49},[28,151,132],{"class":53},[28,153,154],{"class":30,"line":83},[28,155,156],{"class":49},"}\n",[28,158,160],{"class":30,"line":159},6,[28,161,74],{"emptyLinePlaceholder":73},[28,163,165,168,172,175,179,181,183,186,189,191,194,197,200,203],{"class":30,"line":164},7,[28,166,167],{"class":41},"function",[28,169,171],{"class":170},"s2Zo4"," updateUser",[28,173,174],{"class":49},"(",[28,176,178],{"class":177},"sHdIc","id",[28,180,50],{"class":49},[28,182,54],{"class":53},[28,184,185],{"class":49},",",[28,187,188],{"class":177}," patch",[28,190,50],{"class":49},[28,192,193],{"class":53}," Partial",[28,195,196],{"class":49},"\u003C",[28,198,199],{"class":53},"User",[28,201,202],{"class":49},">)",[28,204,121],{"class":49},[28,206,208],{"class":30,"line":207},8,[28,209,210],{"class":34},"  \u002F\u002F patch 的所有字段都是可选的\n",[28,212,214],{"class":30,"line":213},9,[28,215,156],{"class":49},[102,217,219],{"id":218},"pickt-k-omitt-k","Pick\u003CT, K> & Omit\u003CT, K>",[18,221,223],{"className":20,"code":222,"language":22,"meta":23,"style":23},"type UserBasic = Pick\u003CUser, 'name' | 'email'>\ntype UserWithoutEmail = Omit\u003CUser, 'email'>\n",[25,224,225,265],{"__ignoreMap":23},[28,226,227,230,233,235,238,240,242,244,246,249,252,255,257,260,262],{"class":30,"line":31},[28,228,229],{"class":41},"type",[28,231,232],{"class":53}," UserBasic",[28,234,57],{"class":49},[28,236,237],{"class":53}," Pick",[28,239,196],{"class":49},[28,241,199],{"class":53},[28,243,185],{"class":49},[28,245,60],{"class":49},[28,247,248],{"class":63},"name",[28,250,251],{"class":49},"'",[28,253,254],{"class":49}," |",[28,256,60],{"class":49},[28,258,259],{"class":63},"email",[28,261,251],{"class":49},[28,263,264],{"class":49},">\n",[28,266,267,269,272,274,277,279,281,283,285,287,289],{"class":30,"line":38},[28,268,229],{"class":41},[28,270,271],{"class":53}," UserWithoutEmail",[28,273,57],{"class":49},[28,275,276],{"class":53}," Omit",[28,278,196],{"class":49},[28,280,199],{"class":53},[28,282,185],{"class":49},[28,284,60],{"class":49},[28,286,259],{"class":63},[28,288,251],{"class":49},[28,290,264],{"class":49},[10,292,293],{"id":293},"泛型约束",[18,295,297],{"className":20,"code":296,"language":22,"meta":23,"style":23},"function getLength\u003CT extends { length: number }>(arg: T): number {\n  return arg.length\n}\n\ngetLength('hello')  \u002F\u002F ✅\ngetLength([1, 2, 3]) \u002F\u002F ✅\ngetLength(123)       \u002F\u002F ❌ number 没有 length\n",[25,298,299,343,358,362,366,385,411],{"__ignoreMap":23},[28,300,301,303,306,308,311,314,317,320,322,325,328,331,333,336,339,341],{"class":30,"line":31},[28,302,167],{"class":41},[28,304,305],{"class":170}," getLength",[28,307,196],{"class":49},[28,309,310],{"class":53},"T",[28,312,313],{"class":41}," extends",[28,315,316],{"class":49}," {",[28,318,319],{"class":126}," length",[28,321,50],{"class":49},[28,323,324],{"class":53}," number",[28,326,327],{"class":49}," }>(",[28,329,330],{"class":177},"arg",[28,332,50],{"class":49},[28,334,335],{"class":53}," T",[28,337,338],{"class":49},"):",[28,340,324],{"class":53},[28,342,121],{"class":49},[28,344,345,349,352,355],{"class":30,"line":38},[28,346,348],{"class":347},"s7zQu","  return",[28,350,351],{"class":45}," arg",[28,353,354],{"class":49},".",[28,356,357],{"class":45},"length\n",[28,359,360],{"class":30,"line":70},[28,361,156],{"class":49},[28,363,364],{"class":30,"line":77},[28,365,74],{"emptyLinePlaceholder":73},[28,367,368,371,373,375,377,379,382],{"class":30,"line":83},[28,369,370],{"class":170},"getLength",[28,372,174],{"class":45},[28,374,251],{"class":49},[28,376,64],{"class":63},[28,378,251],{"class":49},[28,380,381],{"class":45},")  ",[28,383,384],{"class":34},"\u002F\u002F ✅\n",[28,386,387,389,392,396,398,401,403,406,409],{"class":30,"line":159},[28,388,370],{"class":170},[28,390,391],{"class":45},"([",[28,393,395],{"class":394},"sbssI","1",[28,397,185],{"class":49},[28,399,400],{"class":394}," 2",[28,402,185],{"class":49},[28,404,405],{"class":394}," 3",[28,407,408],{"class":45},"]) ",[28,410,384],{"class":34},[28,412,413,415,417,420,423],{"class":30,"line":164},[28,414,370],{"class":170},[28,416,174],{"class":45},[28,418,419],{"class":394},"123",[28,421,422],{"class":45},")       ",[28,424,425],{"class":34},"\u002F\u002F ❌ number 没有 length\n",[10,427,428],{"id":428},"小结",[14,430,431],{},"TypeScript 的类型系统非常强大，掌握这些工具类型能让代码更安全、更简洁。",[433,434,435],"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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":23,"searchDepth":38,"depth":38,"links":437},[438,439,443,444],{"id":12,"depth":38,"text":12},{"id":100,"depth":38,"text":100,"children":440},[441,442],{"id":104,"depth":70,"text":105},{"id":218,"depth":70,"text":219},{"id":293,"depth":38,"text":293},{"id":428,"depth":38,"text":428},"2026-06-28","分享几个日常开发中常用的 TypeScript 技巧，包括类型推导、工具类型和泛型约束。",false,"md",null,{},"\u002Fblog\u002Ftypescript-tips",{"title":5,"description":446},"blog\u002Ftypescript-tips",[455,456,457],"typescript","javascript","tips","5XsZ_AAc1qAzaegmwEGRjVg4T666tVyus_USPfd8ik0"]