0Pricing
TypeScript Academy · 课时

映射类型中的修饰符: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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 映射类型:转换对象类型
  2. 映射类型中的修饰符:readonly 与 ?
  3. 模板字面量类型:字符串模式
  4. 使用 as 在映射类型中重新映射键
← 返回 TypeScript Academy