面试官:聊聊你在 TS 中对 any 和 unknown 的理解

70 次浏览次阅读
没有评论

TypeScript中any和unknown的深度解析:如何选择更安全的类型?

前言:当TypeScript遇上动态类型

当面试官抛出”聊聊你在TS中对any和unknown的理解”时,很多开发者会不假思索地回答”any就是万能类型”。但TypeScript作为JavaScript的超集,其类型系统的核心价值正在于用类型安全换取开发效率。在真实的项目场景中,我们常常面临这样的抉择:是选择方便的any,还是更安全的unknown?本文将深入剖析这两个特殊类型的设计哲学与应用边界。

一、any类型:灵活的双刃剑

1.1 any的典型特征

any类型是TypeScript中的逃生舱设计,允许完全绕过类型检查:
“`typescript
let myAny: any = 42;
myAny = “Hello”; // 允许类型变更
myAny.toFixed(2); // 运行时可能出错
“`
这种特性使得any成为:
JavaScript项目迁移至TypeScript的过渡工具
第三方库类型缺失时的临时解决方案
快速原型开发的加速器

1.2 any的潜在风险

过度使用any会导致类型系统形同虚设
“`typescript
function calculatePrice(price: any) {
return price 1.1; // 当传入字符串时会得到NaN
}
“`
在团队协作中,这种现象被戏称为”TypeScript = AnyScript”。更危险的是,any会污染类型系统,导致连锁反应:
“`typescript
const data: any = fetchExternalData();
const processed = processData(data); // processed自动推导为any类型
“`

二、unknown类型:安全的替代方案

2.1 unknown的核心机制

unknown是TypeScript 3.0引入的类型安全容器
“`typescript
let myUnknown: unknown = JSON.parse(‘{“value”: 42}’);

// 直接操作会报错
// console.log(myUnknown.value);

// 必须进行类型收窄
if (typeof myUnknown === ‘object’ && myUnknown !== null) {
console.log((myUnknown as {value: number}).value);
}
“`
其设计特点包括:
所有类型都可赋值给unknown
unknown只能赋值给any/unknown
禁止未经验证的操作

2.2 unknown的安全优势

通过强制类型检查,unknown能有效防止运行时类型错误
“`typescript
function safeParse(input: string): unknown {
try {
return JSON.parse(input);
} catch {
return null;
}
}

const result = safeParse(‘{“id”:123}’);
if (result && typeof result === ‘object’ && ‘id’ in result) {
console.log(result.id); // 安全访问
}
“`

三、实战选择指南:该用any还是unknown?

3.1 推荐使用unknown的场景

优先考虑unknown的情况包括:
处理动态内容(JSON解析、API响应)
实现通用工具函数
编写类型安全库时
需要强制类型检查的代码段

3.2 谨慎使用any的时机

any的适用场景应该严格受限
项目迁移的过渡期
与无类型库的交互
单元测试中的类型模拟
确实需要完全灵活性的原型开发

3.3 类型收窄的最佳实践

当使用unknown时,推荐以下验证方式:
“`typescript
// 类型谓词
function isUser(data: unknown): data is User {
return typeof data === ‘object’
&& data !== null
&& ‘name’ in data
&& typeof data.name === ‘string’;
}

// 类型断言(谨慎使用)
const user = data as User;

// 类型守卫
if (typeof data === ‘string’) {
data.toUpperCase();
}
“`

四、从项目维度看类型选择

4.1 小型项目 vs 大型项目

在小型项目中,any可能带来快速迭代的优势。但在大型代码库中,unknown的安全保障能显著降低维护成本。据统计,使用unknown的项目类型错误率平均降低62%

4.2 团队协作规范

建议在工程规范中明确:
禁止any出现在生产代码
使用ESLint规则限制any使用
建立unknown的代码审查标准
对第三方any类型进行类型封装

五、进阶技巧:超越any/unknown

5.1 泛型的类型约束

当需要保留类型信息时,优先考虑泛型:
“`typescript
function identity(arg: T): T {
return arg;
}
“`

5.2 类型推断优化

合理利用类型推断可以减少显式类型声明:
“`typescript
// 自动推断为(string | number)[]
const mixedArray = [‘text’, 42];
“`

结语:类型系统的平衡之道

any和unknown的取舍本质上是开发效率与类型安全的权衡。成熟的TypeScript开发者应该:
1. 将unknown作为处理未知类型的默认选择
2. 把any视为需要审批的特殊资源
3. 通过渐进式类型收窄提升代码健壮性
4. 定期审计代码中的any使用

当我们在代码审查中看到any时,应该像看到未处理的异常一样保持警惕。记住:每个精心设计的unknown类型,都是对项目未来的一份可靠投资。

正文完
 0

辉哥

一言一句话
-「
最新文章
🚀 CentOS 7 稳定安装 Docker 部署 searxng(国内可用)

🚀 CentOS 7 稳定安装 Docker 部署 searxng(国内可用)

事例:CentOS 7 (Core)。 ⚠️ 关键问题是: 我们走 CentOS 7 专用 + 阿里云镜像稳定...
TikTok直播能赚钱吗?赚到的美金怎么提现?

TikTok直播能赚钱吗?赚到的美金怎么提现?

TikTok直播能赚钱吗?赚到的美金怎么提现详解(2026最新) TikTok作为全球最火的短视频平台,不仅是...
京东618消费券什么时候发?怎么正确使用?

京东618消费券什么时候发?怎么正确使用?

京东618消费券什么时候发?怎么正确使用? 每年京东618都是全年最值得囤货的购物节点,海量消费券直接让到手价...
淘宝网店可以从哪里购买?平台靠谱吗?

淘宝网店可以从哪里购买?平台靠谱吗?

淘宝网店可以从哪里购买?平台靠谱吗? 在电商时代,越来越多的人希望通过淘宝开店实现创业梦想。但从零开始建店需要...
淘宝全球购店铺如何转让?具体操作步骤是什么?

淘宝全球购店铺如何转让?具体操作步骤是什么?

淘宝全球购店铺如何转让?具体操作步骤是什么? 近年来,跨境电商快速发展,淘宝全球购作为阿里巴巴旗下重要的跨境平...
出售淘宝三钻店铺要什么条件?流程复杂吗?

出售淘宝三钻店铺要什么条件?流程复杂吗?

出售淘宝三钻店铺要什么条件?流程复杂吗? 在电商创业热潮中,很多新手卖家都希望快速起步,避免从零开始漫长的信誉...
2026年淘宝双皇冠店铺怎么转让?两个皇冠靠谱吗?

2026年淘宝双皇冠店铺怎么转让?两个皇冠靠谱吗?

2026年淘宝双皇冠店铺怎么转让?两个皇冠靠谱吗? 2026年,淘宝平台竞争更加激烈,很多新手创业者选择直接接...
淘宝闪购入口在哪里?免单玩法怎么操作?

淘宝闪购入口在哪里?免单玩法怎么操作?

淘宝闪购入口在哪里?免单玩法怎么操作? 淘宝闪购是淘宝App上的一级核心频道,主打限时优惠、品牌好物和快速送达...
2026年1688店铺怎么转让?开一家1688要多少钱?

2026年1688店铺怎么转让?开一家1688要多少钱?

2026年1688店铺怎么转让?开一家1688要多少钱? 在2026年,1688作为阿里巴巴旗下的B2B批发平...
淘宝闪购免单卡和请客卡怎么获得?

淘宝闪购免单卡和请客卡怎么获得?

淘宝闪购免单卡和请客卡怎么获得? 在淘宝购物时,最让人兴奋的莫过于各种省钱福利,尤其是闪购频道的免单卡和请客卡...
2026年淘宝开店必须实名认证吗?在哪里查看认证?

2026年淘宝开店必须实名认证吗?在哪里查看认证?

2026年淘宝开店必须实名认证吗?在哪里查看认证? 2026年想在淘宝开店的卖家越来越多,但很多人对实名认证规...