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

为何TypeScript认为Readonly<number>与number类型等价?

TypeScript中Readonly处理基础类型的行为解析

这是TypeScript的有意设计,核心原因和原始类型的特性、Readonly工具类型的定位有关:

1. 原始类型与对象类型的本质区别

number、string这类属于原始类型,它们在运行时是不可变的值,并非对象。TypeScript在类型层面允许通过keyof number获取其原型方法的名称,只是为了支持对原始值调用原型方法的类型检查(比如(123).toString()),但这并不意味着原始类型本身是一个可被修改属性的对象类型。

2. Readonly工具类型的设计目标

Readonly的核心作用是为对象类型的属性添加readonly修饰符,限制属性的修改。当传入原始类型时,TypeScript会自动跳过映射逻辑,直接返回原始类型本身——因为原始类型不存在“可修改的属性”,给不存在的属性添加readonly没有实际意义,类型系统会优先保留原始类型的语义。

3. 关于你期望的类型

如果你想构造一个包含number原型方法且属性为readonly的对象类型,需要手动定义:

type ReadonlyNumber = {
  readonly [K in keyof number]: number[K]
}

但这个类型和number并不等价:ReadonlyNumber是一个对象类型,而number是原始类型,在类型检查中二者不能互相赋值。

内容的提问来源于stack exchange,提问作者math-chen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 00:27:02