如何在TypeScript嵌套对象键路径中排除Date原生属性
解决TypeScript生成对象嵌套键路径时排除Date原生成员的问题
要实现只保留Date属性本身、排除其原生方法和属性的嵌套键路径生成,可以通过自定义TypeScript类型工具来过滤Date类型的递归遍历。
核心类型实现
// 判断是否为Date类型 type IsDate<T> = T extends Date ? true : false; // 生成嵌套键路径的核心类型 type NestedKeyPaths<T> = T extends object ? IsDate<T> extends true ? never // 遇到Date类型,停止递归,不展开其原生成员 : { [K in keyof T]: K extends string | number ? `${K}` | `${K}.${NestedKeyPaths<T[K]>}` : never; }[keyof T] : never;
代码说明
IsDate<T>:通过类型条件判断传入的类型是否为Date,用于后续终止递归。NestedKeyPaths<T>:- 首先判断当前类型是否为对象;
- 如果是
Date类型,返回never,表示不再展开该属性的成员; - 对于普通对象,遍历其所有键,递归生成当前键与子键路径的拼接字符串;
- 最终通过
[keyof T]提取所有可能的键路径联合类型。
使用示例
// 测试用的对象类型 type TestObj = { id: number; info: { name: string; createTime: Date; meta: { updateTime: Date; version: string; }; }; }; // 获取纯净的嵌套键路径 type Paths = NestedKeyPaths<TestObj>; // Paths的结果为: // "id" | "info" | "info.name" | "info.createTime" | "info.meta" | "info.meta.updateTime" | "info.meta.version"
可以看到,createTime和updateTime作为Date类型属性,只会保留自身的键路径,不会展开toString、toLocaleString等原生方法。
如果需要生成运行时的键路径数组,可以基于上述类型编写对应的函数,利用类型约束确保生成的路径符合预期。
内容的提问来源于stack exchange,提问作者user2910789
相关产品推荐
相关产品推荐

