[K in keyof T] 映射类型
最后更新:2026-10-22
[K in keyof T] 映射类型
映射类型"遍历键、变换值":[K in keyof T]: boolean 对 T 的每个键 K 生成同名新属性。它是批量改类型的流水线——Partial 加可选、Readonly 加只读,全是一行映射的产物。
| 分组 | 泛型 |
|---|---|
| 类型 | 语法 |
| 严格模式 | 不需要 |
ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。
📝 语法
type BooleanFlags<T> = {
[K in keyof T]: boolean;
};
// 组合修饰符:readonly 加只读,-? 去可选
type MyReadonly<T> = { readonly [K in keyof T]: T[K] };
type Concrete<T> = { [K in keyof T]-?: T[K] };
⚙️ 参数
| [K in keyof T] | 遍历子句:K 依次绑定 T 的每个键名 |
|---|---|
| T[K] | 值变换:新属性的类型,可以运算(boolean、T[K] | null、包装类型等) |
| readonly / ? / -? | 修饰符:映射时可加/去 readonly 与可选标记 |
返回值:映射类型返回一个新对象类型:键集合与 T 相同(或经 as 过滤改名),值类型按映射规则变换。
▶ 示例
修改下面的代码,点击试一试查看转译运行结果:
输出:
{"dark":true,"beta":false,"newNav":true}
true false
(转译后运行输出;flags.dark 拿到的是 boolean 而不是原本的 true 字面量——映射规则把每个字段都变成了 boolean)
💡 要点
ℹ️ 说明 内置 Partial、Readonly、Pick、Record 全部由映射类型实现——读懂 [K in keyof T] 就读懂了工具类型章节的一半。
💡 提示 as 子句可以改键名或过滤:{ [K in keyof T as NewKey<K>]: T[K] } 用模板字面量改名,as never 直接删掉该键——键值一起变的进阶玩法。
⚠️ 注意 映射 keyof T 是同态的(保留原修饰符),但对联合类型直接映射(Record 风格)不保留可选/只读——"我的 ? 怎么丢了"多半是这个差异。
🏷️ 相关泛型
💡 相关案例
更多案例即将上线。
📚 相关教程
❓ 常见问题
Q 映射类型和索引签名有什么区别?
A 索引签名 [k: string]: T 声明"任意键都是 T",键名不固定;映射 [K in keyof T] 逐一复制已知键,类型逐键精确。前者宽泛兜底,后者精确变换。
Q 能只映射部分键吗?
A 可以:用 as 过滤([K in keyof T as K extends "id" ? never : K])或先 Pick/Omit 再映射。键集合的裁剪发生在 as 子句。
Q 映射类型能映射成函数或数组吗?
A 能:{ [K in keyof T]: (v: T[K]) => void } 生成一组回调;{ [K in keyof T]: T[K][] } 把每个字段变数组——值位置的变换不限于简单类型。