TypeScript泛型约束报错:Type parameter 'A'存在循环约束
解决TypeScript泛型循环约束报错问题
我想创建一个泛型类型,它包含参数类型本身,同时在nodes字段下包含自身的数组。写了下面的代码:
type Foo<T> = T & { nodes: Foo<T>[] } function Bar<A extends Foo<A>>():null{ return null; }
运行时出现报错:
Type parameter 'A' has a circular constraint
我知道这是循环约束,但这正是我想要的效果,希望能像这样使用:
interface Vegetables{ id:number nodes: Vegetables[] } interface Fruits{ id:number nodes: Fruits } Bar<Vegetables>() Bar<Fruits>()
不清楚哪里出了问题。
你写的Bar函数里,泛型约束A extends Foo<A>触发了TypeScript的循环约束检测,而实际上完全没必要用这种绕弯的方式。
你要的是让Bar接受那些带nodes字段(字段类型是自身数组或自身)的类型,直接针对这个需求写约束就行:
方案一:直接定义泛型约束
function Bar<A extends { nodes: A[] | A }>(): null { return null; }
方案二:用工具类型封装约束逻辑(适合复杂场景)
// 工具类型:校验类型是否包含符合要求的nodes字段 type HasValidNodes<T> = T extends { nodes: T[] | T } ? T : never; function Bar<A extends HasValidNodes<A>>(): null { return null; }
用这两种写法,你给出的Vegetables和Fruits接口都能正常传入Bar,不会再报循环约束的错误。
至于你原来的Foo<T>,它是把T和带递归nodes的对象做交叉类型,这种递归结构用在泛型约束里会触发TypeScript的循环检测,但实际上你根本不需要它——直接检查目标类型的结构就完全能满足需求。
内容的提问来源于stack exchange,提问作者Alex Ironside
相关产品推荐
相关产品推荐

