any、unknown、never 有什么区别
先理解原理和示例,再练习完整口述与追问。
回答要点
any 跳过大量类型检查;unknown 要先缩小类型再使用;never 表示不应出现的值或不正常结束的路径,可用于穷尽检查。用接口结果、异常对象、状态分支举例。
原理拆解
any 让类型检查在相关位置失效,错误还可能传播到后续调用;unknown 允许接收任意值,但操作前必须验证和收窄;never 表示不应存在的值或无法正常返回的分支。它们描述静态约束,不会自动替你校验网络数据。
示例与推演
function readName(value: unknown): string {
if (typeof value === 'object' && value !== null && 'name' in value) {
const name = (value as { name: unknown }).name
if (typeof name === 'string') return name
}
throw new TypeError('name 必须是字符串')
}
关键在运行时检查,断言只是辅助描述已验证结构。
易错点
把响应强断言成 User 不能让服务器数据变正确。never 不等于 void:void 表达不使用正常返回值,never 表达没有该种正常结果。
参考回答可直接练习口述
any 会让相关操作绕过大量类型检查,容易把错误传播出去;unknown 可以接收未知值,但使用前必须通过检查收窄,适合外部数据和异常。never 表示不可能出现的值,可用于联合类型的穷尽检查,也可表达抛出异常或永不正常返回的函数。我的原则是边界未知值优先 unknown,确认形状后再用;不要通过随意 as 和 any 假装接口已被验证。