typescript中的泛型递归函数

xzlaal3s  于 2022-11-26  发布在  TypeScript
关注(0)|答案(1)|浏览(146)

我想写一个如下的递归函数

  1. function withChildren<
  2. T extends {
  3. id?: string;
  4. parentId?: string;
  5. },
  6. TWithChild extends T & {
  7. children: TWithChild[];
  8. }
  9. >(parentItem: T, items: T[]): TWithChild {
  10. const children = items.filter((ba) => ba.parentId === parentItem.id);
  11. return {
  12. ...parentItem,
  13. children: children.map((child) => withChildren(child, items)),
  14. };
  15. }

但typescript抛出错误
键入'T {子项(& C):(T扩展了“有访问权限的业务区”?“有儿童和访问权限的业务区”:有子女的业务区域)[];}"无法分配给类型“T”扩展“具有访问权限的业务区域”?“具有儿童访问权限的业务区域:有子女的业务领域
我已经查找了这个错误,但仍然没有找到任何解决办法

x6492ojm

x6492ojm1#

TWithChildextendsT & ...,意思是如果用作显式类型参数,它可以合并,例如{a: 1},您不知道它的确切类型,因此无法示例化它。
将其定义为已知的受限泛型类型,这样它就可以工作了

  1. type TWithChild<T> = T & {children: TWithChild<T>[]}
  2. function withChildren<
  3. T extends {
  4. id?: string;
  5. parentId?: string;
  6. }
  7. >(parentItem: T, items: T[]): TWithChild<T> {
  8. const children = items.filter((ba) => ba.parentId === parentItem.id);
  9. return {
  10. ...parentItem,
  11. children: children.map((child) => withChildren(child, items)),
  12. };
  13. }

Playground

展开查看全部

相关问题