[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][] } 把每个字段变数组——值位置的变换不限于简单类型。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏