在 TypeScript 中,keyof any 是一个特殊的用法,它的类型表现为 string | number | symbol。这是因为在 JavaScript 中,对象的键可以是字符串、数字或者是符号(symbol)。keyof any 表达的意思是“任意类型的键”。
解释 keyof any
当使用 keyof 关键字对任意类型(any)进行操作时,TypeScript 会解释为该类型可以拥有的所有可能键的类型。由于 any 类型基本上取消了类型检查,提供了无限制的自由,所以 keyof any 反映了对象属性键可以是这三种基本类型之一:
- string:JavaScript 中最常见的键类型。
- number:虽然在访问时 JavaScript 会将数字键转换为字符串,但数组和类似数组的对象使用数字索引。
- symbol:ES6 引入的符号类型,主要用于创建唯一的对象键。
```function getProperty<T>(obj: T, key: keyof any): any {
return obj[key]; // 注意这里,由于key是 keyof any,这意味着key可以是任意的string, number或symbol
}
const data = {
name: "Alice",
age: 25,
[Symbol.iterator]: function* () {
yield* [this.name, this.age];
}
};
const name = getProperty(data, "name"); // 正常运作
const age = getProperty(data, 1); // TypeScript不会报错,因为keyof any包括number
const iterator = getProperty(data, Symbol.iterator); // 正常运作