运行NG BUILD时报错:DeepTypeOfCollection非泛型且存在循环引用
解决NG BUILD时的DeepTypeOfCollection类型错误
错误1:type DeepTypeOfCollection is not generic
这个错误是因为你在使用DeepTypeOfCollection时传入了泛型参数,但类型别名的定义里并没有声明泛型约束。比如你写了DeepTypeOfCollection<MyType>,但定义却是:
// 错误写法:无泛型参数 type DeepTypeOfCollection = { /* ... */ }
修复方式:给类型别名添加泛型参数声明:
// 正确写法:声明泛型参数T type DeepTypeOfCollection<T> = { // 基于T的类型定义 }
如果是反过来——定义了泛型但使用时没传参数,那就补全泛型参数,比如DeepTypeOfCollection<YourTargetType>。
错误2:Type alias DeepTypeOfCollection circularly references itself
这是因为你的类型定义中存在无限递归引用,比如直接在类型里又引用了DeepTypeOfCollection本身,却没有设置递归终止条件。比如:
// 错误写法:无限递归 type DeepTypeOfCollection<T> = T extends Array<infer U> ? DeepTypeOfCollection<U>[] : T extends object ? { [K in keyof T]: DeepTypeOfCollection<T[K]> } : DeepTypeOfCollection<T>; // 这里又引用了自身,导致循环
修复方式:添加递归终止条件,当处理到基本类型(非对象/数组)时直接返回该类型,不再递归:
// 正确写法:添加基本类型终止条件 type DeepTypeOfCollection<T> = T extends Array<infer U> ? DeepTypeOfCollection<U>[] : T extends object ? { [K in keyof T]: DeepTypeOfCollection<T[K]> } : T; // 基本类型直接返回,终止递归
如果你的场景里需要处理特殊对象(比如Date、Map这类不需要深层遍历的),可以把它们加入终止条件:
type DeepTypeOfCollection<T> = T extends Date | Map<any, any> | Set<any> ? T // 特殊对象直接返回 : T extends Array<infer U> ? DeepTypeOfCollection<U>[] : T extends object ? { [K in keyof T]: DeepTypeOfCollection<T[K]> } : T;
内容的提问来源于stack exchange,提问作者mruanova
相关产品推荐
相关产品推荐

