作为前端开发工程师,在 TypeScript 中使用 unknown 类型是提升类型安全的关键实践。下面我会结合实际开发场景详细讲解其特性和价值。

unknown 核心特性

1.类型安全的顶级类型

  • any 类似,可接受任何类型的赋值:
let userInput: unknown;
userInput = "Hello";     // √ 合法
userInput = 42;          // √ 合法
userInput = [1, 2, 3];   // √ 合法
  • 但禁止直接操作(编译时拦截风险操作):
userInput.trim();        // × 错误:Object is of type 'unknown'
userInput.toFixed(2);    // × 错误

2.类型收窄(Type Narrowing)

必须显式验证类型后才能使用:

function processInput(input: unknown) {if (typeof input === "string") {console.log(input.toUpperCase()); // √ 安全操作} else if (Array.isArray(input)) {console.log(input.length);       // √ 安全操作}
}
let b = processInput([1])
let a = processInput('s')

3.与 any 的关键区别

// any 允许危险操作(运行时崩溃风险)
let anyValue: any = "test";
anyValue.nonExistingMethod(); // 编译通过 → 运行时报错// unknown 强制类型检查
let unknownValue: unknown = "test";
unknownValue.nonExistingMethod(); // 编译时报错

前端开发场景应用

1.API 响应处理

处理不确定结构的 API 数据(如第三方接口):

async function fetchData<T>(url: string): Promise<T> {try {const response = await fetch(url);if (!response.ok) {throw new Error(`HTTP error! status: ${response.status}`);}return await response.json();} catch (error) {console.error('Fetch error:', error);throw error; // 重新抛出错误或返回默认值}
}// 类型守卫实现
function isUserData(obj: unknown): obj is { name: string; age: number } {return (obj !== null &&typeof obj === "object" &&"name" in obj &&"age" in obj &&typeof (obj as any).name === "string" &&typeof (obj as any).age === "number");
}

2.表单验证

处理动态表单输入值:


function validateFormField(value: unknown): boolean {if (typeof value === "string") {return value.length > 0 && value.trim().length > 0; // 添加 trim() 检查空字符串} else if (typeof value === "number") {return value >= 0;} else if (typeof value === "boolean") {return true; // 布尔值通常都是有效的}return false; // 处理 null、undefined、object 等其他类型
}

3.错误处理

try/catch 中安全处理异常(TypeScript 4.4+ 默认 catch 变量为 unknown):

try {// 可能抛出错误的操作
} catch (error: unknown) {if (error instanceof Error) {console.error(error.message); // √ 安全访问} else {console.error("Unknown error", error);}
}

类型安全对比总结

特性unknownanyvoid
赋值自由度可接受任意类型值可接受任意类型值仅接受 undefined
操作限制禁止直接操作,需类型守卫允许任意操作不可赋值给其他变量
类型安全性⭐⭐⭐⭐⭐ (最高)⭐ (最低)⭐⭐⭐⭐
使用场景动态数据/外部输入迁移旧代码无返回值函数
TS 验证强度强制显式类型检查无类型检查中等强度检查
替代建议✅ 优先替代 any❌ 避免使用✅ 合理使用
典型前端应用API响应/表单输入/错误处理遗留代码适配事件回调函数
核心结论
  1. 安全替代 anyunknown 在保持灵活性的同时通过编译时检查消除运行时风险

  2. 防御性编程:强制开发者显式处理类型不确定性,减少 undefined is not a function 等错误

  3. 演进趋势:在现代 TypeScript 项目中,应始终坚持:

    • unknown 取代 any

    • 用类型守卫代替类型断言(as

    • 在公共接口/外部数据入口处优先使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95352.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95352.shtml
英文地址,请注明出处:http://en.pswp.cn/web/95352.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 批量下载hasmart所有知乎回答,文章和想法,导出txt,html和pdf

之前分享过文章2025 一键批量下载备份知乎回答/文章/想法/专栏/视频/收藏夹&#xff0c;导出txt&#xff0c;html和 pdf &#xff0c;今天继续下载hasmart这个号的所有知乎回答 下载的知乎回答目录&#xff0c;包含发布时间和标题&#xff0c;点击可跳转对应回答。 2019年发布…

mapbox高阶,结合threejs(threebox)添加管道,实现管道流动效果

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言 1.1 ☘️mapboxgl.Map 地图对象 1.2 ☘️mapboxgl.Map style属性 1.3 ☘️threebox add加载网格对象 二、🍀…

语音识别后处理——如何语音断句加上标点、顺滑、ITN等

基本流程 基于cpu的计算&#xff1a; 前往intel官网下载libmkl相关的库&#xff1a;libmkl_core.a、libmkl_gf_lp64.a、libmkl_sequential.a # 静默安装 ./intel-onemkl-2025.2.0.629_offline.sh -a -s --eula accept默认安装目录&#xff1a;/opt/intel/oneapi libmkl相关的…

[吾爱出品] 图片转换王 v1.01 - 多格式支持 / 支持pds、Ai格式

[吾爱出品] 图片转换王 多格式支持 链接&#xff1a;https://pan.xunlei.com/s/VOZ81aeES9JDqlcvXPKYlxwqA1?pwdni9b# 图片转换王」是一款专为设计师、自媒体从业者及普通用户打造的专业图片格式转换工具&#xff0c;秉持绿色便携理念&#xff0c;无需繁琐安装步骤&#xf…

GitLab 18.3 正式发布,更新多项 DevOps、CI/CD 功能【一】

沿袭我们的月度发布传统&#xff0c;极狐GitLab 发布了 18.3 版本&#xff0c;该版本带来了通过直接转移进行迁移、CI/CD 作业令牌的细粒度权限控制、自定义管理员角色、Kubernetes 1.33 支持、通过 API 让流水线执行策略访问 CI/CD 配置等几十个重点功能的改进。下面是对部分重…

【macOS】垃圾箱中文件无法清理的--特殊方法

【macOS】垃圾箱中文件无法清理的特殊方法直接拖拽到 Beyond Compare App中&#xff0c;删除时&#xff0c;选择以下选项即可彻底删除。1.在macOS桌面&#xff0c;将垃圾箱打开2.将垃圾文件和文件夹&#xff0c;拖拽到Beyond Compare界面3.选中待删除的文件和文件夹如上图。4.鼠…

Python UV 管理如何使用镜像源安装 Python

uv python install [版本号] --mirrorhttps://github.com/astral-sh/python-build-standalone/releases/download/这是默认情况下 uv python 安装命令&#xff0c;命令会找到 astral 公司在 Github 上的存储库&#xff0c;然后进行下载。我们只需要为 mirror 增加任意 Github 镜…

SPI片选踩坑实录(硬件片选和软件片选)

SPI&#xff08;Serial Peripheral Interface&#xff0c;串行外设接口&#xff09;的片选信号&#xff08;Chip Select&#xff0c;简称 CS 或 SS&#xff0c;即 Slave Select&#xff09;是 SPI 通信中用于选择从设备的关键控制信号&#xff0c;其作用是在多从设备的 SPI 总线…

从理论到RTL,实战实现高可靠ECC校验(附完整开源代码/脚本)(3) RTL实现实战

第二部分&#xff1a;ECC &#xff08;30&#xff0c; 24&#xff09;RTL实现实战 - 精雕细琢的硬件卫士 理论是基石&#xff0c;实现是关键。本部分将 手把手构建参数化、可综合、高可靠的ECC编解码器 。本部分将以MIPI 协议中Packet Header 用到的ECC(30&#xff0c;24) 为例…

揭密设计模式:像搭乐高一样构建功能的装饰器模式

揭密设计模式&#xff1a;像搭乐高一样构建功能的装饰器模式 在软件开发中&#xff0c;我们常常会遇到一个问题&#xff1a;如何给一个对象动态地添加新功能&#xff0c;同时又不想修改它的代码&#xff1f;如果直接在原有类上修修补补&#xff0c;代码会变得臃肿复杂&#xff…

【Vue】前端 vue2项目搭建入门级(二)

本文不同于【Vue】前端 vue2项目搭建入门级&#xff08;一&#xff09;&#xff0c;本文创建vue2项目方式是一键创建vue2 项目&#xff0c;不需要自己配置。1.cmd进入根目录&#xff0c;输入vue create project&#xff08;vue create 项目名&#xff09;创建一个project的项目…

基于SQLite索引的智能图片压缩存储系统设计与实现

摘要 本文介绍一种基于SQLite索引的智能图片压缩存储系统&#xff0c;通过融合图像质量压缩与数据压缩技术&#xff0c;实现60-80%的压缩率&#xff0c;较传统方法压缩效率提升4-5倍。系统采用“大文件存储索引数据库”架构&#xff0c;针对性解决海量图片数据迁移与存储中的核…

【一张图看懂Kafka消息队列架构】

一张图看懂Kafka消息队列架构Kafka架构全景图ApacheKafka作为当今最流行的分布式消息队列系统&#xff0c;其架构设计精巧而高效。通过一张典型的Kafka架构图&#xff0c;我们可以清晰地看到几个核心组件&#xff1a;生产者(Producer)、消费者(Consumer)、主题(Topic)、分区(Pa…

计算机三级嵌入式填空题——真题库(24)原题附答案速记

1.表征数字音频每秒钟数据量的参数称为波形声音的__码率__。CD音乐的声音信号的采样率约为44kHz&#xff0c;量化位数为16位&#xff0c;采用双声道&#xff0c;则该参数的值为__1408__kb/s。&#xff08;码率取样频率*量化位数*声道数44kHz*16*21408kb/s&#xff09;2.利用载波…

Gradle vs. Maven,Java 构建工具该用哪个?

Java构建工具的甜咸粽子之争&#xff0c;就是 Gradle 和 Maven 该用哪个&#xff1f; 随心所欲的手动挡 vs. 稳如老狗的自动挡 Maven用的是pom.xml。很多人一听XML就头大&#xff0c;觉得又臭又长。但换个角度想&#xff0c;XML的缺点正是它最大的优点&#xff1a;死板、规范、…

将Markdown文档输出成Word格式

大家好&#xff01;今天想和大家分享一个技术文档格式转换的小故事。有个朋友在软件行业从事文档工作&#xff0c;她们的手册是用Markdown编写的&#xff0c;使用Facebook的Docsaurus框架&#xff0c;在线浏览很方便&#xff0c;但输出Word格式却很不方便&#xff0c;问我是否有…

COMSOL基于Voronoi毛细管及多边形骨料ITZ的微介观混凝土水分扩散模型

本案例是通过COMSOL对论文An innovative method for mesoscale modelling of moisture diffusion in concrete&#xff08;https://doi.org/10.1016/j.cemconcomp.2024.105836&#xff09;中Voronoi毛细管、多边形骨料、ITZ、水泥浆体多相材料的几何模型复现。 其中论文中的混…

机器学习和高性能计算中常用的几种浮点数精度

浮点数 (Floating-Point Number) 是一种在计算机中表示带有小数部分的数字的方式。它通过科学记数法类似的方式&#xff08;尾数 基数 ^ 指数&#xff09;来近似表示实数。浮点数的精度决定了它可以表示的数值范围以及数值之间的精细程度。 常见的浮点数精度包括&#xff1a;F…

开源大语言模型(Qwen3)

Qwen3是阿里巴巴达摩院于2025年4月29日发布的新一代开源大语言模型&#xff0c;属于通义千问系列的最新成员。其核心突破在于首创混合推理架构&#xff0c;将人类认知科学中的“快思考”与“慢思考”机制融入模型设计&#xff0c;实现了复杂任务处理与高效响应的平衡。 一、技术…

懒人精灵本地离线卡密验证系统教程(不联网、安全稳定、省钱、永久免费、无任何限制)

1.合集懒人精灵本地离线卡密验证系统教程(不联网、安全稳定、省钱、永久免费、无任何限制):https://www.bilibili.com/video/BV1B5PjeGETQ/ 备注: 1.本地离线卡密采用最安全的非对称加解密技术,设备id采用最安全多重混合加密不可逆技术生成,验证阶段需要网络时间,内置防抓…