📅  最后修改于: 2023-12-03 15:05:39.375000             🧑  作者: Mango
在 TypeScript 中,如果我们想要操作一个对象的属性名,我们可以使用 keyof 关键字。keyof 的作用是获取一个类型的所有属性名(即键名)组成的联合类型。
下面来看一个使用 keyof 的例子。
interface Person {
name: string;
age: number;
}
type PersonKey = keyof Person;
// PersonKey 的值为 "name" | "age"
上面定义了一个接口 Person
,包含了 name
和 age
两个属性。然后使用 keyof 获取了 Person
的属性名,因此 PersonKey
的值为 "name" | "age"
的联合类型。
这个联合类型可以用在很多地方,例如定义一个对象的属性类型:
interface Person {
name: string;
age: number;
}
type PartialPerson = {
[K in keyof Person]?: Person[K];
}
const p: PartialPerson = {
age: 18,
};
上面的例子定义了一个 PartialPerson
类型,它是 Person
类型的一个子集,只包含了 Person
的部分属性。这个类型的定义使用了 keyof
来遍历 Person
的所有属性,并将它们变成可选的属性。
需要注意的是,使用 keyof
得到的联合类型中,不包含任何索引签名,例如 [key: string]: any;
。如果要对一个包含索引签名的类型使用 keyof
,需要手动将索引签名过滤掉,例如使用 Exclude
来排除索引签名:
interface Person {
name: string;
age: number;
[key: string]: any;
}
type PersonKey = Exclude<keyof Person, string>;
// PersonKey 的值为 "age"
上面的例子中,Person
包含了一个索引签名 [key: string]: any;
,表示它还可以有任何其他的属性。如果要使用 keyof
获取 Person
真实的属性名,需要先使用 Exclude
将索引签名过滤掉。
总的来说,使用 keyof 可以更加方便地操作 TypeScript 类型中的属性名,是一个非常有用的特性。