TypeScript 04类型断言与类型守卫有 JS 基础即可阅读。建议先读第 01~03 课本课大量用到第 02 课的「收窄」。1. 问题的起点信息差TS 只认代码里写出来的东西而你经常「额外知道」一些它不知道的事接口文档、页面结构、业务规则constraw{name:Tom,age:18}constparsedJSON.parse(raw)// TS 的视角什么都可能返回不敢保证任何字段// 你的视角看过文档确定就是 { name: string; age: number }TS 的原则是只认证据不信口头保证。本课全部内容就是「额外知识」交给它的几种方式。2. as签担保书把你的知识硬塞给 TSconstassuredJSON.parse(raw)as{name:string;age:number}// 读法我看过数据了它就是这个形状你按这个来两个本质换标签不换值——运行时什么都没做值原封不动只是改了快递箱上的标签箱里东西没变担保书 ≠ 验证器——TS 签收后不再核对谎报了它不管constriskyJSON.parse({name:Tom})as{name:string;age:number}risky.age// ✅ 编译通过 → ❌ 运行时 undefined两个类型毫无重叠时 TS 会拒绝担保Conversion of type X to type Y may be a mistake强行硬转要as unknown as T等于放弃检查慎用。3.!快捷担保——只担保「非空」constbtndocument.querySelector(.submit-btn)!// 我确定页面上一定有btn.addEventListener(click,onClick)担保错了就是运行时TypeError。更稳的替代是给 TS 看证据if (btn) { ... }。4. is把「证据」打包成函数第 02 课的收窄typeof/in有效是因为 TS亲眼看到了证据——但证据写在 if 里不可复用。is把证据装进函数随处复用、收窄照常生效typeBird{fly:()string}typeFish{swim:()string}// 读法函数返回 true 时调用处的 pet 就是 FishfunctionisFish(pet:Bird|Fish):petisFish{returnswiminpet// 函数体里还是那个证据}functionfeed(pet:Bird|Fish){if(isFish(pet)){returnpet.swim()// ✅ 收窄生效}returnpet.fly()// ✅ 剩余分支是 Bird}关键对比——返回类型写成boolean链条就断了functionisFish(pet:Bird|Fish):boolean// ❌ TS 不知道 true 和 Fish 有什么关系functionisFish(pet:Bird|Fish):petisFish// ✅ true 就是证据5. never 与穷尽检查防盗警报never 没有任何值能是它「不可能存在」。推演一遍穷尽检查typeShape{kind:circle;r:number}|{kind:rect;w:number;h:number}functionarea(s:Shape):number{switch(s.kind){casecircle:returnMath.PI*s.r**2// 这里 s 收窄为 circle 分支caserect:returns.w*s.h// 这里 s 收窄为 rect 分支default:const_alarm:nevers// 能掉进 default 的 s 谁都没处理 空集 neverreturn_alarm}}这行能编译通过 TS 替你确认了「全覆盖」。以后给Shape加{ kind: square }却忘写 casedefault 里的 s真的可能是 square不再是空集赋给never立刻报错——平时不响一响必有贼漏分支。6. satisfiesas 的改良版初学可先跳过同样贴标签但贴之前先验一遍形状且不丢精确推断constconfig{home:{path:/,title:首页},about:{path:/about,title:关于},}satisfies Recordstring,{path:string;title:string}config.home.path// ✅ 精确类型还在能补全// ❌ 某个 title 拼成 tittle → 立刻报错配置表、路由表、常量表这类「结构要验、细节要留」的场景优先satisfies。7. 断言 vs 守卫怎么选手段语义用在哪as/!我担保TS 不再验证边界处第三方库缺类型、DOM 查询、已知结构的 JSONis/ typeof / in先验证再用证据项目内部逻辑默认选它satisfies验证但保留精确推断配置 / 路由 / 常量表原则边界可以断言守好门内部优先收窄。断言用得越多类型系统越像摆设。8. 高频报错速查报错人话Conversion of type X to type Y may be a mistake两个类型没重叠TS 拒绝瞎担保Type Square is not assignable to type never穷尽检查触发switch 漏了新分支Object is possibly undefined该收窄或!了Property x does not exist on type unknownunknown 未收窄就想用