📜  typescript keyof - TypeScript (1)

📅  最后修改于: 2023-12-03 15:05:39.375000             🧑  作者: Mango

TypeScript 的 keyof 关键字

在 TypeScript 中,如果我们想要操作一个对象的属性名,我们可以使用 keyof 关键字。keyof 的作用是获取一个类型的所有属性名(即键名)组成的联合类型。

下面来看一个使用 keyof 的例子。

interface Person {
    name: string;
    age: number;
}

type PersonKey = keyof Person;

// PersonKey 的值为 "name" | "age"

上面定义了一个接口 Person,包含了 nameage 两个属性。然后使用 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 类型中的属性名,是一个非常有用的特性。