[{"data":1,"prerenderedAt":101},["ShallowReactive",2],{"$fNw-oySF_xlodULpM_FUIGm6f_ogspnuAoT1JHc98Mug":3,"$f3Fq3Vvc1RPyMVhHFov2pUb_iMkT70EUmvvI_ji0wSyQ":16},{"title":4,"date":5,"category":6,"readTime":7,"tags":8,"content":12,"_excerpt":13,"id":14,"_path":15},"TypeScript 实用技巧","2026-02-25","技术教程","7 分钟",[9,10,11],"TypeScript","前端","编程技巧","\u003Ch1>TypeScript 实用技巧\u003C\u002Fh1>\n\u003Ch2>类型推断\u003C\u002Fh2>\n\u003Ch3>类型守卫\u003C\u002Fh3>\n\u003Cp>使用类型守卫来缩小类型范围：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-typescript\">function isString(value: unknown): value is string {\n  return typeof value === &#39;string&#39;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>类型断言\u003C\u002Fh3>\n\u003Cp>使用 \u003Ccode>as\u003C\u002Fcode> 进行类型断言：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-typescript\">const element = document.getElementById(&#39;my-element&#39;) as HTMLElement\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>高级类型\u003C\u002Fh2>\n\u003Ch3>泛型\u003C\u002Fh3>\n\u003Cp>创建可重用的泛型函数：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-typescript\">function identity&lt;T&gt;(arg: T): T {\n  return arg\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>条件类型\u003C\u002Fh3>\n\u003Cp>根据条件选择类型：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-typescript\">type IsString&lt;T&gt; = T extends string ? true : false\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>映射类型\u003C\u002Fh3>\n\u003Cp>基于现有类型创建新类型：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-typescript\">type Readonly&lt;T&gt; = {\n  readonly [P in keyof T]: T[P]\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>工具类型\u003C\u002Fh2>\n\u003Ch3>Partial\u003C\u002Fh3>\n\u003Cp>使所有属性变为可选：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-typescript\">type Partial&lt;T&gt; = {\n  [P in keyof T]?: T[P]\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Pick\u003C\u002Fh3>\n\u003Cp>选择指定的属性：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-typescript\">type Pick&lt;T, K extends keyof T&gt; = {\n  [P in K]: T[P]\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Omit\u003C\u002Fh3>\n\u003Cp>排除指定的属性：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-typescript\">type Omit&lt;T, K extends keyof T&gt; = Pick&lt;T, Exclude&lt;keyof T, K&gt;&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>总结\u003C\u002Fh2>\n\u003Cp>掌握这些 TypeScript 技巧可以让你写出更类型安全、更优雅的代码。\u003C\u002Fp>\n","使用类型守卫来缩小类型范围：","typescript-tips","\u002Fwriting\u002Ftypescript-tips\u002F",[17,28,42,53,63,74,88,99],{"id":18,"title":19,"date":20,"category":6,"readTime":21,"tags":22,"_excerpt":26,"_path":27},"cf-xray-nginx-tutorial","移动宽带 SSH 不到海外 VPS？CF + nginx 反向代理的全套方案","2026-06-16","17 分钟",[23,24,25],"333","eee","999","3 分钟摘要： - 移动宽带到 VPS 的 SSH 流量被 GFW 识别并阻断 - 用 Cloudflare CDN 隐藏真实 VPS IP（免费方案） - xray VLESS + WebSocket 加密代理流量 - nginx 网站防御 G网 主动探测","\u002Fwriting\u002Fcf-xray-nginx-tutorial\u002F",{"id":29,"title":30,"date":31,"category":32,"readTime":33,"tags":34,"_excerpt":40,"_path":41},"telegram-86-login-recovery","86 手机号无法登录 Telegram 终极解决方案：绕过付费验证码 + 旧设备验证找回账号","2026-06-14","工具教程","8 分钟",[35,36,37,38,39],"Telegram","86手机号","账号找回","二次验证","短信收费","3 分钟摘要： - 86 号码 + 邮箱 + 二次验证密码 = 找回账号的三要素，缺一不可 - 用第三方客户端 Telega（绕过 Google Play 校验版本）登录，触发邮箱 + 2FA 通道 - 登录成功后再用官方 Telegram 登录、更新到最新版本 - 整个过程不需要原手机短信、不需要","\u002Fwriting\u002Ftelegram-86-login-recovery\u002F",{"id":43,"title":44,"date":45,"category":46,"readTime":33,"tags":47,"_excerpt":51,"_path":52},"indie-developer-journey","从零到一：我的独立开发之路","2026-05-15","创业人生",[48,49,50],"独立开发","创业","个人成长","2023年初，我做出了一个重要决定：离开稳定的工作，成为一名独立开发者。这个决定并非一时冲动，而是经过深思熟虑的结果。","\u002Fwriting\u002Findie-developer-journey\u002F",{"id":54,"title":55,"date":56,"category":6,"readTime":57,"tags":58,"_excerpt":61,"_path":62},"vue3-composition-api","Vue 3 Composition API 完全指南","2026-04-28","12 分钟",[59,60,10],"Vue","JavaScript","Composition API 是 Vue 3 引入的一组基于函数的 API，它允许我们使用函数来组织组件逻辑，而不是选项对象。","\u002Fwriting\u002Fvue3-composition-api\u002F",{"id":64,"title":65,"date":66,"category":6,"readTime":67,"tags":68,"_excerpt":72,"_path":73},"react-native-performance","React Native 性能优化实战","2026-04-15","10 分钟",[69,70,71],"React Native","性能","移动端","在开发 React Native 应用时，我们经常会遇到以下性能问题：","\u002Fwriting\u002Freact-native-performance\u002F",{"id":75,"title":76,"date":77,"category":78,"readTime":79,"tags":80,"_excerpt":86,"_path":87},"futures-trading-seven-rules","期货交易的七条铁律：从亏损到稳定盈利的思考","2026-03-20","交易心得","5 分钟",[81,78,82,83,84,85],"期货交易","交易思维","止损","趋势跟踪","心法","做期货这几年，踩过的坑、爆过的仓、熬过的夜，最终都沉淀成这七条心得。期货交易本质上不是预测行情，而是管理自己。以下每一条都是真金白银换来的，建议反复读、慢慢悟。","\u002Fwriting\u002Ffutures-trading-seven-rules\u002F",{"id":89,"title":90,"date":91,"category":92,"readTime":79,"tags":93,"_excerpt":97,"_path":98},"git-workflow-best-practices","Git 工作流最佳实践","2026-03-10","开发工具",[94,95,96],"Git","团队协作","版本控制","这是一个经典的分支模型：","\u002Fwriting\u002Fgit-workflow-best-practices\u002F",{"id":14,"title":4,"date":5,"category":6,"readTime":7,"tags":100,"_excerpt":13,"_path":15},[9,10,11],1781610782243]