readonly将类型所有属性标记为只读,编译器阻止重新赋值;其为映射类型,遍历keyof t并加readonly修饰;仅作用于第一层,嵌套对象内部仍可修改。

直接用 Readonly<t></t> 就能把一个类型的所有属性标记为只读,编译器会阻止对这些属性的重新赋值。
基础用法:一步封装整个接口
比如有这样一个用户配置类型:
interface UserConfig {theme: string;
fontSize: number;
autoSave: boolean;
}
只需一行就能生成它的只读版本:
type ReadonlyUserConfig = Readonly此时 ReadonlyUserConfig 中的 theme、fontSize、autoSave 全部带 readonly 修饰符。尝试修改会立刻触发 TypeScript 报错,编辑器也会标红提示。
底层原理:映射类型自动遍历所有键
Readonly 是 TypeScript 内置的映射类型,定义等价于:
完整的Galileo AI平台 TypeScript/JS SDK 参考,用于评估、观察和保护 GenAI 应用。适用于构建 Node.js 或 TypeScript 项目。
readonly [P in keyof T]: T[P];
};
它做了三件事:
-
keyof T获取类型T所有属性名的联合类型(如"theme" | "fontSize" | "autoSave") -
P in ...遍历每个属性名 -
readonly [...]给每个属性加上只读修饰,值类型保持不变
配合 const 断言,实现运行时+类型双重锁定
如果对象是字面量,推荐搭配 as const 使用:
theme: "dark",
fontSize: 14,
autoSave: true
} as const;
这样不仅属性不可赋值,连属性值的字面量类型也被精确推导(例如 theme 类型是 "dark" 而非 string),比单纯用 Readonly 更严格。
注意边界:只读 ≠ 不可变嵌套对象
Readonly<t></t> 只作用于第一层属性。如果某个属性本身是对象,该对象内部仍可修改:
user: { name: string };
};
const r: Readonly
r.user.name = "Bob"; // ✅ 允许 —— user 属性只读,但 user.name 不受保护
需要深层只读,请用自定义 DeepReadonly<t></t> 或第三方库如 ts-toolbelt。










