JavaScript 语言 类型操作符keyof与infer的结合

JavaScript阿木 发布于 2025-06-25 11 次阅读


JavaScript 类型系统中的 Keyof 与 Infer:深入理解类型操作的艺术

JavaScript 作为一种动态类型语言,其类型系统相对灵活。随着现代 JavaScript 的发展,TypeScript 的引入为 JavaScript 带来了静态类型检查,使得开发者能够更早地发现潜在的错误。在 TypeScript 中,`keyof` 和 `infer` 是两个强大的类型操作符,它们可以帮助开发者更精确地控制类型,提高代码的可维护性和可读性。本文将围绕这两个操作符展开,深入探讨它们的用法和结合使用时的技巧。

Keyof 操作符

`keyof` 操作符是 TypeScript 中用于获取对象键的类型的一个操作符。它返回一个类型,该类型是对象键的联合类型。简单来说,如果你有一个对象,`keyof` 可以告诉你这个对象有哪些键。

基本用法

typescript

interface Person {


name: string;


age: number;


}

type PersonKeys = keyof Person; // 'name' | 'age'


在上面的例子中,`PersonKeys` 类型是 `'name' | 'age'`,它表示 `Person` 对象的键可以是 `'name'` 或 `'age'`。

联合类型

`keyof` 可以与联合类型一起使用,以获取多个对象键的联合类型。

typescript

interface Person {


name: string;


age: number;


}

interface Address {


city: string;


zipCode: number;


}

type PersonOrAddressKeys = keyof Person | keyof Address; // 'name' | 'age' | 'city' | 'zipCode'


类型别名

`keyof` 也可以用于类型别名。

typescript

type PersonKeys = keyof Person; // 'name' | 'age'


Infer 操作符

`infer` 操作符用于在类型守卫或类型断言中推断类型。它通常与类型守卫一起使用,以简化类型推断过程。

基本用法

typescript

function isString(value: any): value is string {


return typeof value === 'string';


}

function isNumber(value: any): value is number {


return typeof value === 'number';


}

function isStringOrNumber(value: any): value is string | number {


return isString(value) || isNumber(value);


}

const value = 'Hello';


if (isStringOrNumber(value)) {


// value 现在是 string | number 类型


}


在上面的例子中,`isStringOrNumber` 函数通过 `isString` 和 `isNumber` 类型守卫推断 `value` 的类型。

类型断言

`infer` 也可以与类型断言一起使用。

typescript

function parseInput<T>(input: string): T {


// 假设我们有一些解析逻辑


return JSON.parse(input) as T;


}

const parsed = parseInput<number>({ number: 42 }); // parsed 现在是 number 类型


在上面的例子中,`parseInput` 函数使用 `infer` 来推断返回类型 `T`。

Keyof 与 Infer 的结合使用

将 `keyof` 和 `infer` 结合使用可以创建更复杂的类型操作,以下是一些示例:

推断对象键的类型

typescript

function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {


return obj[key];


}

const person = { name: 'Alice', age: 25 };


const name = getProperty(person, 'name'); // name 类型是 string


在上面的例子中,`getProperty` 函数使用 `keyof` 来推断 `key` 参数的类型,并使用 `infer` 来推断返回类型。

类型守卫与 Keyof

typescript

function isPerson(obj: any): obj is Person {


return 'name' in obj && 'age' in obj;


}

const obj = { name: 'Bob', age: 30 };


if (isPerson(obj)) {


const name = obj.name; // name 类型是 string


}


在这个例子中,`isPerson` 函数使用 `keyof` 来检查对象是否具有 `Person` 接口中的键。

总结

`keyof` 和 `infer` 是 TypeScript 中强大的类型操作符,它们可以帮助开发者更精确地控制类型,提高代码的质量。通过理解它们的用法和结合使用,开发者可以编写更健壮、更易于维护的代码。在 TypeScript 的世界中,掌握这些类型操作的艺术,将使你的代码更加优雅和高效。