keyof keyof 操作符

最后更新:2026-10-22

keyof keyof 操作符

keyof T 取对象类型 T 的所有键名,得到字面量联合类型:keyof Settings 就是 "volume" | "theme"。它是"键名类型安全"的基石——配合泛型约束,函数参数里的键名拼错会立刻报错。

分组泛型
类型操作符
严格模式不需要

ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。

📝 语法

interface Settings {
  volume: number;
  theme: string;
}

type SettingKey = keyof Settings; // "volume" | "theme"

function read<T, K extends keyof T>(settings: T, key: K): T[K] {
  return settings[key];
}

⚙️ 参数

keyof T键名联合:T 的全部键名的字面量联合类型(有 string 索引签名时退化为 string | number)
K extends keyof T经典组合:把键名参数约束在真实键名范围内
T[K]索引访问:键名对应的"值类型",vol 自动是 number

返回值:keyof 是类型运算符,不产生运行时代码;T[K] 让返回值类型随键名精确联动。

▶ 示例

修改下面的代码,点击试一试查看转译运行结果:

输出:

60 dark

(转译后运行输出;键名拼错(如 "volumn")会得到编译错误——K 被 keyof T 约束)

💡 要点

ℹ️ 说明 keyof 的结果随对象形状自动更新:给 Settings 加个字段,键名联合自动多一项——这是手写 "volume" | "theme" | "lang" 永远做不到的同步。
💡 提示 keyof + 泛型是工具类型的原料:Pick<T, K extends keyof T>、Omit 同款签名都靠它保证"只能选真实存在的键"。
⚠️ 注意 数组的 keyof 包含数字索引与全部数组方法名("length" | "push" | ...);对数组取元素类型用 T[number],而不是 keyof。
更多案例即将上线。

📚 相关教程

❓ 常见问题

Q keyof typeof obj 和 keyof Interface 有区别吗?
A typeof obj 先把"值"变回"类型"再取键(常用于常量对象);keyof Interface 直接对类型取键。结果是同构的字面量联合。
Q 对有索引签名的类型用 keyof 会怎样?
A { [k: string]: boolean } 的 keyof 是 string | number——键名不再收窄为字面量,防拼错的能力随之消失;需要精确键名就别用宽索引签名。
Q T[K] 是什么?
A 索引访问类型:拿键名类型 K 去查 T 的对应值类型。K = "volume" 时 T[K] 就是 number——键名与值类型的联动全靠它。
Web-Tutorial.com

Web-Tutorial 技术团队

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

100%

🙏 帮我们做得更好

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

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