我在代码中有这个:

interface OneThing {
}

interface AnotherThing extends OneThing {
}

interface ThirdThing extends AnotherThing {
}

interface ThingKeeper {
  getThings<T extends OneThing>(): T[];
}

class Thingamajigger implements ThingKeeper {
  getThings(): ThirdThing[] {
    return new Array<ThirdThing>();
  }
}

Typescript编译器在Thingamajigger中的getThings()上给我一个错误。

文件:“Sandbox.ts”
严重性:“错误”
消息:“类'Thingamajigger'错误地实现了接口(interface)'ThingKeeper'。
属性“getThings”的类型不兼容。
类型'()=> ThirdThing []'不可分配给类型'()=> T []'。
类型“ThirdThing []”不可分配给类型“T []”。
无法将类型“ThirdThing”分配给类型“T”。
位于:“14,7”
来源:“ts”
码:“2420”

这不行吗?

感谢您的任何反馈。

最佳答案

如果查看类型检查器报告的错误消息,则很明显发生了什么:

  • () => ThirdThing[]不可分配给<T extends OneThing>() => T[]
  • ThirdThing[]不可分配给T[]
  • ThirdThing不可分配给T
  • ThirdThingT类型不相关,例如,如果考虑这样的层次结构:
       OneThing
      /       \
     T       ThirdThing
    

    因此,编译器说不能确定分配它。解决方案是通过T类关联ThirdThingThingKeeper:
    interface OneThing {
    }
    
    interface AnotherThing extends OneThing {
    }
    
    interface ThirdThing extends AnotherThing {
    }
    
    interface ThingKeeper<T extends OneThing> {
      getThings(): T[];
    }
    
    class Thingamajigger implements ThingKeeper<ThirdThing> {
      getThings(): ThirdThing[] {
        return new Array<ThirdThing>();
      }
    }
    

    09-11 05:19