当前位置: 首页 > news >正文

怎么对比 as const 和 readonly 在类型窄化中的区别?

在 TypeScript 中,若想实现字面量类型窄化或深层不可变,优先选 as const;若仅需限制属性重新赋值,使用 readonly 修饰符即可。

先说结论:as const 侧重于值类型的字面量推断与深层冻结,readonly 侧重于对象属性的赋值权限控制。

  • 适合:需要数组元素或对象属性值为具体字面量类型(如 'red' 而非 string)时使用 as const。
  • 重点看:readonly 默认只保护当前层级,嵌套对象内部属性仍可能被修改。
  • 别忽略:as const 会递归添加 readonly,导致整个结构无法变更,适合配置常量。

核心用法与场景

根据你需要保护的粒度选择语法:

// 场景 1:只需防止属性被重新赋值
interface User { readonly id: string; }// 场景 2:需要字面量类型 + 深层不可变
const config = { db: { host: "localhost" } } as const;

1. 检查数组类型推断:如果直接定义数组,类型通常是宽泛的 number[] 或 string[]。若需要元素类型为字面量,需添加 as const。

const colors = ["red", "green"] as const;
// 类型推断为:readonly ["red", "green"]

2. 检查嵌套对象可变性:如果配置对象有多层结构,使用 readonly 修饰符可能无法保护内层属性。

interface Config { readonly db: { host: string; }; }
const config: Config = { db: { host: "localhost" } };
config.db.host = "127.0.0.1"; // ✅ 允许修改嵌套属性

3. 应用深层冻结:改用 as const 可锁死所有层级。

const config = { db: { host: "localhost" } } as const;
config.db.host = "127.0.0.1"; // ❌ 编译错误

原理简述

两者在类型系统层面的根本定位不同。readonly 是属性访问修饰符,本质是对属性访问权限的标记,类似于 public 或 private,它仅限制该属性不可被重新赋值,但不改变类型本身的推断逻辑。而 as const 是字面量类型断言,强制 TypeScript 将值的类型推断为最精确的字面量类型,并递归添加 readonly 修饰。

在线验证与测试

除了本地 IDE 悬浮查看类型外,建议使用 TypeScript Playground 进行在线交互验证,确保行为符合预期。

验证步骤:

  1. 访问 TypeScript Playground。
  2. 将上述代码片段粘贴到编辑器中。
  3. 观察左侧类型提示,或尝试修改属性查看报错信息。

若显示为字面量联合类型(如 "red" | "green")或包含 readonly 标记的元组,说明 as const 生效。尝试修改属性或数组 push 操作,若编辑器报错提示“无法分配到只读属性”或“方法不存在”,则保护机制已生效。

常见坑

  1. readonly 的局限性:仅作用于当前层级,嵌套对象的属性默认仍可变,不要误以为加了 readonly 就万事大吉。
  2. 数组方法丢失:使用 as const 后的数组变为只读元组,push、splice 等修改方法将不可用,编译时会报错。
  3. 类型过窄:as const 会将类型锁死为字面量,若后续需要作为普通 string 或 number 使用,可能需要额外的类型转换。

参考来源

  • TypeScript 官方文档 - Const Assertions

原文链接:https://www.zjcp.cc/ask/11040.html

http://www.jsqmd.com/news/812598/

相关文章:

  • 成都钢板生产厂家|成都热轧卷板钢材厂家|成都热轧H型钢加工_四川盛世钢联国际贸易有限公司 - 四川盛世钢联营销中心
  • 基于MCP协议集成AI求职助手:自动化简历优化与面试准备
  • E-GEO:基于多智能体架构的AI搜索引擎优化工具实战指南
  • 联想拯救者笔记本终极控制指南:开源工具完全替代官方软件
  • FPGA阵列信号处理矩阵算子高性能实现【附代码】
  • 构建增强型ClawHub数据层API:基于NestJS与MongoDB的工程实践
  • 2026年佛山镀锌钢材质量排行:佛山型材拉弯、佛山工字钢、佛山彩瓦、佛山槽钢、佛山耐磨钢板、佛山螺纹钢、佛山角铁选择指南 - 优质品牌商家
  • 习酒回收专业技术解析:中石油加油卡回收/五粮液回收/京东E卡回收/利群购物卡回收/剑南春回收/商场购物卡回收/国台回收/选择指南 - 优质品牌商家
  • AwaDB:轻量级嵌入式向量数据库,AI应用开发的瑞士军刀
  • 成套电气控制柜技术选型指南:激光专用集成机柜、电气机械智能集成系统柜、算力集成柜、能源化工电气集成控制柜、西门子CPU模块选择指南 - 优质品牌商家
  • 如何培养批判性思维?
  • 物联网时代:从技术连接到价值过滤的思辨与实践
  • ARM GICv3中断控制器中的GICR_INMIR0寄存器详解
  • 2026年5月企业级紫外线消毒灯定制优选:深度解析行业标杆宁波大榭开发区佑威光电有限公司 - 2026年企业推荐榜
  • [实战] 2026年制造业SPC统计过程控制(statistical process contro…
  • 多物流机器人任务调度与路径规划【附程序】
  • 2026年口碑好的uv转印机稳定供货厂家推荐 - 品牌宣传支持者
  • 2026年5月果汁瓶厂商****:畅维包装科技如何以创新技术引领行业标准? - 2026年企业推荐榜
  • 三亚观泰装饰翻车,家装选靠谱公司技巧
  • 从荒诞专利到严谨工程:硬件系统设计的非技术性思维陷阱
  • 3步搞定Windows部署自动化:MediaCreationTool.bat终极指南
  • 终极番茄小说下载器:免费一键获取全网小说资源并智能转换格式
  • 【NotebookLM专家级笔记架构】:基于认知科学验证的4层信息压缩模型,助你记忆留存率提升3.8倍
  • 2026年Q2抗菌消毒液靠谱品牌排行实测盘点:术前消毒液/物表消毒湿巾/碘伏消毒液/过氧乙酸消毒液/邻苯二甲醛消毒液/选择指南 - 优质品牌商家
  • 铝板椭圆成像无线传输损伤检测【附仿真】
  • 2026年4月全国承载力专项检测鉴定机构排行:房屋结构检测/房屋结构鉴定/房屋鉴定/抗震性专项检测鉴定/校舍安全鉴定/选择指南 - 优质品牌商家
  • Vue 3 项目首屏加载慢如何优化打包体积?
  • PyODBC:企业级Python数据库连接解决方案的技术深度解析
  • 别再只调BERT了!聊聊DeBERTa那些‘反直觉’的设计:解耦注意力与增强解码器
  • 从IMS2017看工程师如何通过顶级会议论文提升职业价值