typescript映射类型通过in keyof t遍历属性,结合readonly、?及+/-前缀批量修改修饰符;支持as重命名键名并同步应用修饰符,实现结构复用与行为动态调整。

TypeScript 中使用映射类型动态转换属性修饰符,核心在于结合 in、keyof 与修饰符控制语法(如 readonly、? 及其增减前缀 +/-),在不重复定义结构的前提下批量调整属性行为。
用 in keyof T 遍历并统一添加修饰符
这是最基础也最常用的模式。例如将所有属性设为只读或可选:
-
type ReadOnly<t> = { readonly [K in keyof T]: T[K] };</t>—— 每个属性都加readonly -
type Partial<t> = { [K in keyof T]?: T[K] };</t>—— 每个属性都加?变为可选
用 +/- 前缀显式增删修饰符
映射类型支持在修饰符前加 +(默认可省略)或 - 来覆盖原始声明:
type Mutable<t in keyof t> —— 移除所有 <code>readonly标记type Required<t in keyof t> —— 把原本可选的属性强制变为必填</t>type ReadonlyOptional<t readonly in keyof t> —— 同时应用 <code>readonly和?
组合修饰符与类型变换同步进行
修饰符可以和值类型的转换一起写,比如让所有字段可选且允许为 null:
type PartialAndNullable<t in keyof t null></t>- 对
{ name: string; age: number }应用后,得到{ name?: string | null; age?: number | null }
用 as 子句重命名键名再修饰
TypeScript 4.1+ 支持在映射中用 as 重映射键名,适合做字段格式转换(如驼峰转下划线)的同时加修饰:
type SnakeCaseKeys<t in keyof t as k extends string>}` : K]: T[K] };</t>- 若配合修饰符:
type SnakeCaseReadonly<t readonly in keyof t as k extends string>}` : K]: T[K] };</t>










