You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中as const与readonly的区别是什么?

TypeScript 中 readonly 数组标注与 as const 断言的核心区别

二者虽然都能让数组失去修改类方法(比如push、pop)的调用权限,但核心差异非常明显:

  • 本质属性与推导逻辑不同
    readonly string[] 是显式类型标注,仅限定数组的可变性和元素的基础类型,不会限制数组长度,也不会收窄元素为字面量类型。上例中arr的类型是通用的只读字符串数组,任意长度、任意字符串元素的只读数组都符合该类型要求。
    as const 是常量断言,属于类型收窄能力的一种,会将值推导到最精确的只读字面量类型。上例中arr2的类型是readonly ["test3", "test4"],除了只读属性外,数组长度、每个位置的具体值都被完全固定。
  • 适用范围不同
    readonly 仅可用于数组、元组的类型标注,或是修饰类、接口、类型别名中的属性,只能在类型声明层面使用。
    as const 可作用于所有字面量(原始值、数组、对象),除了将集合标记为只读外,还会递归将所有内部值收窄为不可修改的字面量类型,比如对象使用as const后,所有属性的类型都会变成固定的字面量,无法修改值也无法新增属性。
  • 适用场景不同
    仅需要限定集合不可修改、不需要精确到具体值时,适合用readonly标注,比如函数参数标注为readonly可以明确告知调用方函数不会修改入参数组。
    需要完全固定值的类型、收窄到字面量级别时,适合用as const,比如定义固定配置、常量枚举等场景,不需要手动编写复杂的精确类型标注。

补充示例:

// readonly 标注示例
let arrA: readonly string[] = ["x", "y"]
arrA = ["m", "n", "k"] // 合法,只要是只读字符串数组即可赋值

// as const 断言示例
let arrB = ["x", "y"] as const
arrB = ["m", "n"] // 报错,新数组的字面量类型与原类型不匹配

内容的提问来源于stack exchange,提问作者Randall

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 23:15:00