TypeScript实现无限深度Deep nested types泛型类型的方法
任意深度嵌套对象泛型实现方案
你手动枚举固定层级的写法扩展性很差,要支持无限深度嵌套,直接用递归类型定义即可,TypeScript 3.7+ 版本已稳定支持递归类型别名,不需要手动枚举每一层结构。
核心类型定义
type DeepNested<T> = T | { [key: string]: DeepNested<T> }
这个类型的逻辑完全覆盖你手动枚举的所有场景:
- 第一个分支
T直接匹配最基础的目标类型值,对应你写的第一层非嵌套情况 - 第二个分支是递归定义的对象结构:对象的键为string类型,值可以是
T,也可以是继续嵌套的DeepNested<T>结构,自动支持1层、2层到任意N层的嵌套场景
用法示例
基础类型校验测试
// 所有层级的嵌套值都能通过类型校验 const val1: DeepNested<string> = "直接的原始值"; const val2: DeepNested<string> = { key: "一层嵌套值" }; const val3: DeepNested<string> = { a: { b: "二层嵌套值" } }; const val4: DeepNested<string> = { a: { b: { c: { d: { e: "任意多层嵌套都支持" } } } } };
类属性定义示例
type ConfigValue = string | number | boolean; class AppConfig { // 定义支持任意深度嵌套的配置属性 public config: DeepNested<ConfigValue>; constructor(initConfig: DeepNested<ConfigValue>) { this.config = initConfig; } } // 实例化时传入任意深度的配置对象都符合类型要求 const appConfig = new AppConfig({ appName: "my-app", port: 3000, db: { host: "127.0.0.1", port: 5432, pool: { max: 10, min: 2, timeout: { connect: 5000, idle: 10000 } } } });
可选优化
如果需要排除数组、函数等特殊引用类型,仅匹配普通键值对对象,可以给类型加一层对象类型约束:
type DeepNested<T> = T | Record<string, DeepNested<T>> & object;
内容的提问来源于stack exchange,提问作者argab
相关产品推荐
相关产品推荐

