type ObjectPath<T> =
T extends object
? keyof T extends never
: { [K in keyof T]: [K, ...ObjectPath<T[K]>] }[keyof T]
: [];
这个递归类型的实现非常巧妙。它首先使用条件类型语法,判断传入的类型 T 是否是一个对象,如果是一个对象,就需要继续处理它的键和值。如果 T 是一个空对象(即没有任何键),则返回一个空数组。否则,对于 T 的每个键 K,我们创建一个以 K 开始并继续 T[K] 的 ObjectPath 为路径的数组,并将所有路径组合成一个联合类型。
例如,如果我们有一个如下的嵌套对象:
type ExampleObject = {
c: number;
d: string[];
e: boolean;
那么 ExampleObject 的 ObjectPath 类型将是以下联合类型:
type ExampleObjectPath =
| ['a', 'b', 'c']
| ['a', 'd', number]
| ['e']
这个联合类型表示所有可能的路径,其中每个数组表示从根节点到叶子节点的路径,第一个元素是对象的一个键,后面的元素是嵌套对象中的键。
希望这个解释可以更好地理解 ObjectPath 类型的实现。如果您有任何问题,请随时问我。