返回

深度解析TS类型体操:玩转DeepKeyOf,点亮对象遍历新技能

前端

背景

在TypeScript中,keyof可以获取一个接口的所有键名。然而,它并没有提供递归获取接口键名的能力,这种能力非常有用,例如在编写通用函数时,我们需要知道对象的所有键名,以便对对象进行遍历和操作。

认识DeepKeyOf

DeepKeyOf是一个高级TypeScript类型,它允许我们递归地获取一个接口的所有键名。换句话说,它可以获取接口中所有子接口和属性的键名。

DeepKeyOf的语法如下:

type DeepKeyOf<T> = T extends object ? (T[keyof T] extends object ? keyof T & keyof DeepKeyOf<T[keyof T]> : keyof T) : never;

其中,T是我们要获取键名的类型。

实例详解

为了更好地理解DeepKeyOf的用法,我们来看几个实例:

interface User {
  name: string;
  age: number;
  address: {
    street: string;
    city: string;
    state: string;
  };
}

type DeepKeysOfUser = DeepKeyOf<User>;

// DeepKeysOfUser = "name" | "age" | "address" | "address.street" | "address.city" | "address.state"

从这个例子中,我们可以看到,DeepKeyOf可以获取User接口及其所有子接口的键名。

再看一个例子:

interface Product {
  id: number;
  name: string;
  price: number;
  categories: string[];
  tags: string[];
  relatedProducts: {
    [key: string]: Product;
  };
}

type DeepKeysOfProduct = DeepKeyOf<Product>;

// DeepKeysOfProduct = "id" | "name" | "price" | "categories" | "tags" | "relatedProducts" | "relatedProducts.[key]"

在这个例子中,DeepKeyOf可以获取Product接口及其所有子接口和数组的键名。

实战应用

DeepKeyOf在实际开发中有许多应用场景,例如:

  • 编写通用函数:我们可以使用DeepKeyOf来编写一个通用的遍历函数,该函数可以遍历任何对象,并对其所有键名进行操作。
  • 动态生成表单:我们可以使用DeepKeyOf来动态生成表单,表单的字段名和类型可以根据对象的键名和类型自动生成。
  • 数据验证:我们可以使用DeepKeyOf来验证对象的键名和类型是否符合预期的要求。

总结

DeepKeyOf是一个非常强大的TypeScript类型,它可以帮助我们递归地获取一个接口的所有键名。这使得我们能够编写更通用、更灵活的代码。