news 2026/10/28 23:30:18

TypeScript 的 any、unknown、never 有什么区别?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TypeScript 的 any、unknown、never 有什么区别?

TypeScript 的 any、unknown、never 有什么区别?

any 允许咱们按需要访问属性、调用方法,编译器会放宽相关检查。这在迁移旧代码时有时方便,但错误也可能一路传到后面的代码。

unknown 同样可以接收各种值,但使用前要先判断它是什么。例如确认是字符串以后,才能按字符串处理,所以更适合还没验证的外部输入。

never 表示不会出现正常值的类型,常见于不会正常返回的函数,或者已经排除所有情况的分支。它可以用来检查联合类型是否已经处理完整。

因此,接口边界可以先接 unknown,运行时确认结构以后再进入业务类型。不要把 as User 当成校验,也不要为了省几行判断,把所有输入都改成 any。

从一份不可信的 JSON 到可以使用的数据

标注为 User,不会改变收到的数据

假设后端返回一份用户信息,咱们希望 name 是字符串。请求成功只能说明拿到了响应,实际数据里 name 仍可能缺失,或者已经改成另一个形态。

把结果断言成 User,编译器可能同意后续使用,但那份数据并没有被检查。

因此,先把未确认输入保留成 unknown。它会提醒调用方,你还需要做一步判断,才知道能不能读取这个字段。

unknown 让检查成为使用前的条件

例如只接受字符串姓名,可以直接在边界收窄。

functionreadName(value:unknown):string{if(typeofvalue!=="string"){thrownewError("name must be a string");}returnvalue.trim();}console.log(readName(" Lin "));// Lin

这里的 typeof 真正在运行时执行,后续代码又能取得字符串的静态类型。两部分配合,才把输入带进可信范围。

实际 JSON 是嵌套对象时,要逐层检查必要字段,或者采用合适的 Schema 工具。不能只检查 typeof value === “object”,就认定所有内部字段正确,因为 null 和数组也需要另外判断。

Python 也有自己的静态标注与运行时验证方式,但没有同义的 unknown/never 组合语义;本题代码限定 TypeScript。

any 的问题会沿着数据传下去

any 不只是某一行少一次提示。把它传给函数、读出属性或参与表达式以后,后面也可能失去有用的检查信息。

这不是说 any 永远不能用。迁移第三方代码、处理尚未整理的边界时,可以限定一小块范围,同时安排实际验证和后续收紧。

更需要警惕的是在公共函数返回类型里随意写 any。调用方不知道哪里已经检查、哪里仍然不可信,就只能各自猜测。

never 能把遗漏分支暴露出来

假设任务状态是 queued、running、done。使用 switch 分别处理后,默认分支里可以调用一个只接收 never 的函数。

当联合类型增加 failed,而 switch 没有补处理时,默认分支里的值就不再是 never,类型检查可以发现遗漏。

但这个检查的前提,是编译器看到了完整、可信的联合类型。外部 JSON 仍然可能携带未知状态,因此边界验证不能省。

另外,void 通常表达咱们不使用函数的返回值,函数仍可以正常结束;never 的函数不会正常返回。把它们都理解成“没有返回值”,会漏掉这个区别。

本题机制参考,TypeScript 函数与特殊类型、TypeScript 类型收窄。

面试官继续追问

unknown 可以直接强制转成 User 吗?

语法上可以断言,但相应的检查责任仍然在咱们身上。断言不是验证证据,数据进入业务前要有实际检查。

函数抛错误,返回类型一定写 never 吗?

当这个函数在所有执行路径上都不会正常返回时,never 才合适。某个分支可能抛错、其他分支正常返回的函数,需要描述实际返回值。

never 的穷尽检查能防住接口新状态吗?

它能检查代码里的类型覆盖。服务端直接返回未知状态时,首先需要运行时验证与兼容策略,不能指望已经编译好的代码自动发现服务端变化。

面试速记卡

  • any,放宽检查,注意传播范围。
  • unknown,先检查与收窄,再使用。
  • never,没有正常值,用于不返回路径与穷尽检查。
  • void,不使用返回结果,不等于不能正常返回。
  • 接口边界,断言不校验,外部值先验证。

我是程序员Sunday。本文收录于 sunday面试指南,原文与配图可继续阅读。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/25 17:44:01

KPConv点云深度学习实战:从原理到PyTorch代码与调参经验

1. 点云深度学习选型:为什么KPConv值得啃点云数据处理这几年从自动驾驶到三维重建,需求越来越硬核。但点云和图像不一样,它天生无序、稀疏、密度还不均匀,直接套卷积神经网络那套行不通。早期做法要么把点云体素化,要么…

作者头像 李华
网站建设 2026/10/25 22:32:47

VIN码激光打标可读性 三类排查方向

VIN码激光打标可读性 三类排查方向 这篇文章讲的是:所谓 VIN 码激光打标,是指用激光在车身或部件表面直接刻蚀出车辆识别码,形成贯穿全生命周期的追溯标识。本文要回答的问题是,打标后在产线读码正常、到下游工序或客户端复核却掉…

作者头像 李华
网站建设 2026/10/25 4:42:54

基于Django的微博数据分析与可视化系统开发实践

1. 项目背景与核心价值 作为一名长期从事数据挖掘与可视化系统开发的工程师,我最近完成了一个基于Django框架的微博事件分析与可视化系统。这个项目的核心目标是解决传统微博数据分析中存在的几个痛点:首先,人工收集和整理微博数据效率低下且…

作者头像 李华
网站建设 2026/10/26 7:56:54

EnergyPlus建筑能耗模拟实战:从入门到精通

1. 项目概述 EnergyPlus作为建筑能耗模拟领域的标杆工具,其强大的热力学计算引擎和灵活的输入输出机制,使其成为建筑节能设计、HVAC系统优化不可或缺的利器。但在实际应用中,许多工程师常被其陡峭的学习曲线所困扰——从IDF文件编写到气象数据…

作者头像 李华
网站建设 2026/10/27 1:48:40

Gemini 3 Pro如何重塑前端开发:AI集成与智能化交互

1. 从标题拆解行业现状与技术趋势"前端已死,未来已来,谷歌Gemini 3 Pro杀回来了!"这个充满张力的标题背后,反映的是当前Web开发领域正在经历的技术范式转移。作为从业十余年的全栈开发者,我观察到前端技术栈…

作者头像 李华
网站建设 2026/10/27 3:07:00

Python数据挖掘大作业:中文小说文本挖掘实战(从分词到LDA)

简介:面向高校计算机相关专业学生,这份基于Python数据挖掘的期末大作业以东野圭吾小说集为分析对象,完成文本挖掘全流程,是毕业设计、课程设计与期末作业的高分参考方案。项目以zip压缩包形式提供,整体约25.78MB&#…

作者头像 李华