映射类型中的修饰符:readonly 与 ?
在映射类型中使用 +/- 添加或移除修饰符
映射类型中的修饰符:readonly 与 ? 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。
欢迎
映射类型可以使用 `+` 和 `-` 前缀,为属性添加或移除 `readonly` 和可选(`?`)修饰符。
使用 + 添加修饰符
`+` 前缀(默认情况下会隐式使用)会为映射类型中的每个属性添加修饰符。
type Readonly<T> = { +readonly [K in keyof T]: T[K] }; // + is implicit
type Optional<T> = { [K in keyof T]+?: T[K] };使用 - 移除 readonly
使用 `-readonly` 移除属性的 readonly 修饰符。
type Mutable<T> = { -readonly [K in keyof T]: T[K] };
const mutableUser: Mutable<Readonly<User>> = { id: 1, name: 'Alice' };
mutableUser.id = 2; // OK now使用 - 移除 ?
使用 `-?` 移除可选修饰符,使所有属性都变为必需属性。
type Required<T> = { [K in keyof T]-?: T[K] };
// Now all optional properties become required组合 - 和 -?
您可以组合这两种移除操作,创建类型的可变且所有属性必需的版本。
type Concrete<T> = { -readonly [K in keyof T]-?: T[K] };Partial 和 Required 互为相反操作
Partial 使用 +? 添加可选修饰符。Required 使用 -? 移除可选修饰符。
// From TypeScript lib:
type Partial<T> = { [K in keyof T]?: T[K] }; // adds ?
type Required<T> = { [K in keyof T]-?: T[K] }; // removes ?默认保留修饰符
如果不显式使用 + 或 -,映射类型会保留源类型中已有的修饰符。
interface User { readonly id: number; name?: string; }
type Copy<T> = { [K in keyof T]: T[K] };
type C = Copy<User>; // readonly id preserved, name? preserved实际应用:补丁类型
创建一个 Patch 类型,使所有属性变为可选,并同时移除 readonly,以便进行更新。
type Patch<T> = { -readonly [K in keyof T]?: T[K] };DeepReadonly
在映射类型内部使用条件类型,递归地应用 readonly。
type DeepReadonly<T> = {
readonly [K in keyof T]: T[K] extends object ? DeepReadonly<T[K]> : T[K]
};DeepPartial
同样地,递归应用 ?,创建深度可选类型。
type DeepPartial<T> = {
[K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K]
};修饰符组合表
+readonly = 添加 readonly。-readonly = 移除 readonly。+? = 添加可选修饰符。-? = 移除可选修饰符。四种写法可以组合使用。
快速检查
`{ [K in keyof T]-?: T[K] }` 会生成什么?
回顾
在映射类型中,可以在 readonly 和 ? 前使用 +/- 前缀,显式添加或移除这些修饰符。-? 实现 Required,-readonly 实现 Mutable。将二者组合即可全面控制可变性。
常见问题解答
「映射类型中的修饰符:readonly 与 ?」课时是免费的吗?
是的 — 「映射类型中的修饰符:readonly 与 ?」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。
「映射类型中的修饰符:readonly 与 ?」这节课中我会学到什么?
在映射类型中使用 +/- 添加或移除修饰符 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 TypeScript Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「映射类型中的修饰符:readonly 与 ?」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 TypeScript Academy 课中编写并运行代码吗?
能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 映射类型:转换对象类型
- 映射类型中的修饰符:readonly 与 ?
- 模板字面量类型:字符串模式
- 使用 as 在映射类型中重新映射键