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——键名与值类型的联动全靠它。