在 TypeScript 中,keyof
是一个用于获取对象类型的键集合的操作符。它返回一个字符串或数字的联合类型,包含对象类型的所有可用键。keyof
主要用于在编译时进行类型检查,以确保你访问的属性是对象实际拥有的键。
interface Person { name: string; age: number; address: { city: string; postalCode: string; }; } type PersonKeys = keyof Person; // PersonKeys 的类型是 "name" | "age" | "address"
在上述示例中,PersonKeys
是 Person
接口的所有键的联合类型。这意味着 PersonKeys
可以是 "name"、"age" 或 "address" 中的任意一个。
一、基本使用
用keyof组成一个联合类型,来定义函数,以确保传入的参数是对象的合法键。
function getProperty(obj: Person, key: keyof Person) { return obj[key]; } const person: Person = { name: "John", age: 30, address: { city: "New York", postalCode: "10001", }, }; console.log(getProperty(person, "name")); // 输出: "John" console.log(getProperty(person, "age")); // 输出: 30 console.log(getProperty(person, "address")); // 输出: { city: "New York", postalCode: "10001" }
二、keyof和Typeof一起使用 :
在 TypeScript 中,typeof
与 keyof
通常一起使用,用于获取对象的属性名(键)的联合类型。这在创建通用函数或操作对象属性时非常有用。
const person = { name: "John", age: 30, address: { city: "New York", postalCode: "10001", }, }; type PersonKeyType = keyof typeof person; // PersonKeyType 的类型是 "name" | "age" | "address"
在上面的例子中,我们先用typeof把对象的所有属性和属性类型都获取到了,再用keyof把对象属性组成了一个联合类型,它包括了顶层属性 "name"
和 "age"
,以及嵌套对象 address
的属性 "city"
和 "postalCode"
。
使用 keyof 限制函数参数
function getProperty(obj: typeof person, key: keyof typeof person) { return obj[key]; } const personName = getProperty(person, "name"); // 类型是 string const personAge = getProperty(person, "age"); // 类型是 number const city = getProperty(person.address, "city"); // 类型是 string
这个函数 getProperty
接受一个对象和一个属性名,利用 keyof typeof
来限制属性名的合法性,并返回属性对应的值。
keyof
与 typeof
的结合使用提供了更好的类型安全,因为它们反映了对象的实际结构。