返回

TypeScript 面试题:巧用映射类型和 never 提取对象中特定属性

前端

引言

TypeScript 作为一门流行的前端语言,在面试中经常会遇到各种各样的题目。其中一道经典的面试题就是如何从对象中提取特定的属性。这道题看似简单,但它考验的是对 TypeScript 语言的深入理解和灵活运用。

映射类型

映射类型是 TypeScript 中一种强大的工具,它允许我们定义新的类型,该类型是现有类型的子集。映射类型可以使用 type 定义,其语法如下:

type NewType = {
  [Property in KeyType]: ValueType;
};

其中,KeyType 是要映射的属性的类型,ValueType 是要映射的值的类型。

never 类型

never 类型是 TypeScript 中一个特殊的类型,它表示不可能发生的值。never 类型可以用来表示函数的返回值永远不会返回,或者对象永远不会具有某些属性。

巧妙运用映射类型和 never 提取对象中特定属性

现在,让我们来看一道经典的 TypeScript 面试题:

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

// 从 Person 接口中提取 name 和 age 属性
type PickNameAndAge = {};

题目要求我们从 Person 接口中提取 nameage 属性。我们可以使用映射类型和 never 类型来实现:

type PickNameAndAge = {
  [Property in keyof Person]: Property extends "name" | "age" ? Person[Property] : never;
};

在这个映射类型中,我们使用了 keyof Person 来获取 Person 接口的所有属性名。然后,我们使用条件运算符 ? 来判断属性名是否为 "name""age"。如果是,则返回属性的值;否则,返回 never 类型。

最后,我们对映射类型进行取值,得到一个新的类型 PickNameAndAge,它只包含 nameage 两个属性。

总结

通过这篇文章,我们学习了如何巧妙地使用映射类型和 never 类型来从对象中提取特定的属性。这种技巧对于处理复杂的数据结构和优化代码很有帮助。希望这篇文章能够帮助读者更好地理解 TypeScript 的高级用法。

扩展阅读