联合类型用 | 表示“可能是 a 或 b”,限制仅访问共有成员;类型断言(as)手动指定类型,不校验运行时,需配合类型守卫使用以确保安全。

TypeScript 用联合类型描述“可能是 A 或 B”的变量,用类型断言在编译期手动指定具体类型——二者常配合使用,但目的和风险不同。
联合类型:定义“或关系”,限制安全访问
联合类型用 | 连接多个类型,表示值可以是其中任意一种:
-
声明简单明确:比如
let id: string | number表示 id 可以是字符串或数字;type Status = 'loading' | 'success' | 'error'表示字面量联合。 -
访问受限:TS 不知道运行时到底是哪一种,所以只允许调用所有成员共有的属性或方法。例如
string | number只能用.toString()(两者都有),不能直接用.length(number 没有)或.toFixed()(string 没有)。 - 不是类型转换:它不改变值本身,只是告诉编译器“这个变量的取值范围”。
类型断言:绕过检查,告诉编译器“我确定是这个类型”
当联合类型的变量在某一分支中实际已知类型(比如通过条件判断、外部逻辑保证),但 TS 无法自动推导时,可用类型断言强制指定:
使用 Scrapfly SDK(scrapfly-sdk)在 TypeScript 或 JavaScript 中进行网页抓取,用于用户请求抓取 URL、绕过反爬虫防护、渲染页面等场景。
-
两种写法:推荐用
value as string(尤其在 .tsx 文件中避免歧义),旧式<string>value</string>在纯 .ts 中可用但不推荐。 -
典型场景:处理 DOM 元素(
document.getElementById('x') as HTMLInputElement)、解析 API 响应(data as UserResponse)、或在类型守卫分支内补全类型信息。 -
不校验运行时:断言只是“告诉编译器”,不生成任何运行时代码,也不做类型检查。如果断言错误(比如把
null断言为string),运行时会直接报错。
联合类型 + 类型断言 的常见组合方式
单独断言有风险,结合类型守卫更安全:
-
用
typeof守卫后断言:if (typeof input === 'string') { return input.length; }—— 此时无需断言,TS 已缩小类型。 -
用
in或自定义守卫后断言:if ('swim' in animal) { return (animal as Fish).swim(); }—— 守卫提供依据,断言补全能力。 -
非空断言
!是特例:str!.length相当于断言str不为null或undefined,仅适用于你 100% 确保有值的场景。
该优先用守卫,而不是盲目断言
类型守卫(如 typeof、instanceof、自定义函数返回 arg is Type)能让 TS 在分支内自动收窄类型,比断言更安全、更可维护。断言适合守卫难以覆盖的情况(比如跨模块信任边界),但每次使用都应有明确依据,避免掩盖潜在错误。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










