keyof
是 TypeScript 中的一个操作符,用于获取一个类型(通常是一个对象类型或接口)的所有公共属性名组成的字符串字面量联合类型。它常常用于类型安全的属性访问和映射类型的定义。
什么时候使用 keyof
?
- 类型安全的属性访问:当你想要基于某个对象的属性进行类型安全的操作时,可以使用
keyof
来确保属性名的正确性。 - 映射类型:当定义映射类型(将一种类型映射为另一种类型)时,
keyof
可以帮助你获取原始类型的所有属性名。
与什么搭配?
keyof
通常与 TypeScript 的对象类型、接口、和映射类型搭配使用。
如何使用?
假设我们有一个接口 Person
:
interface Person { name: string; age: number; address?: string; }
1.获取所有属性名:
使用 keyof
获取 Person
的所有属性名:
type PersonKeys = keyof Person; // "name" | "age" | "address"
2.类型安全的属性访问:
使用 keyof
来确保我们只在 Person
上访问存在的属性:
function getProperty(person: Person, key: keyof Person) { return person[key]; // 这里是类型安全的 }
3.映射类型:
将 Person
的每个属性值转换为只读(readonly
):
type ReadonlyPerson = { [K in keyof Person]: Readonly<Person[K]>; };
上述代码中,K
代表 Person
的每一个属性名,然后我们使用 Person[K]
获取该属性的类型,并用 Readonly<T>
将其转换为只读。
4.过滤某些属性:
如果你只想获取 Person
的可选属性,可以使用如下方式:
type OptionalKeys<T> = { [K in keyof T]: T[K] extends Required<T>[K] ? never : K }[keyof T]; type OptionalPersonKeys = OptionalKeys<Person>; // "address"
这里我们使用了一个映射类型和条件类型来筛选出所有可选的属性名。