is 类型守卫与断言有什么区别?怎样安全处理 unknown?

先理解原理和示例,再练习完整口述与追问。

运行时验证与编译期承诺;谓词必须真实;null 与数组;边界数据先验证后使用。

as 主要告诉编译器按某类型理解,不生成校验。返回 value is User 的类型谓词则把函数的布尔结果与收窄关联,但编译器仍信任函数实现;如果实现错误,类型安全也会失效。对外部数据应检查所需结构与字段类型,复杂协议可采用合适的 schema 验证,而非到处手写强断言。

ts
type User = { id: string; name: string }
function isUser(value: unknown): value is User {
  if (typeof value !== 'object' || value === null) return false
  const item = value as Record<string, unknown>
  return typeof item.id === 'string' && typeof item.name === 'string'
}
function display(value: unknown) {
  return isUser(value) ? value.name : '无效用户'
}

typeof null 是 object;仅判断对象就宣称完整 User 不够。字段类型正确也未必满足业务权限、格式和取值约束。

断言只是静态承诺,类型守卫应建立真实运行时证据。我让外部数据先以 unknown 进入,验证所需结构后收窄,再做业务校验,不用 any 或 as 掩盖数据风险。TS Narrowing