在 TypeScript 中,keyof
操作符用于获取一个类型的所有属性名组成的联合类型。它可以用来创建泛型函数或接口,用于操作对象的属性名称而不是属性值。
例如,假设我们有一个名为 Person
的接口:
interface Person { name: string; age: number; gender: "male" | "female"; }
如果我们想要定义一个函数,将 Person
对象中某个属性的值取出来,但是我们不想写死这个属性的名称,而是希望能够根据传入的字符串参数动态获取属性名称,那么就可以使用 keyof
操作符来定义泛型类型参数:
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] { return obj[key]; }
在这个例子中,我们定义了一个泛型函数 getProperty
,它接受一个对象 obj
和一个属性名 key
,并返回指定属性名的属性值。通过使用 keyof T
来约束类型参数 K
,我们限制了 key
参数必须是 T
类型的属性名之一。
我们可以使用这个函数来获取 Person
对象中指定属性的值:
const person: Person = { name: "Alice", age: 30, gender: "female" }; getProperty(person, "name"); // "Alice" getProperty(person, "age"); // 30 getProperty(person, "gender"); // "female" getProperty(person, "salary"); // Error: 类型“"salary"”的参数不能赋给类型“"name" | "age" | "gender"”的参数
总之,keyof
操作符可以用来获取类型的所有属性名组成的联合类型,而在泛型函数或接口中使用 keyof
操作符可以对属性名称进行操作,从而实现更加灵活和可重用的代码。