Typescript泛型类型会导致编译错误

时间:2018-02-13 20:38:19

标签: typescript generics compilation

我有一个案例,我需要在不同类别的项目之间获得层次结构。它们都扩展了相同的ItemExt类。

我正在使用Typescript 2.4.2

这是我的代码:

export class ItemCollection<ItemFather extends ItemExt, ItemSon extends ItemExt> {

  constructor(private typeClass: { new (): ItemSon; }, parent? : ItemFather, fatherColl? : ItemCollection<ItemFather, ItemSon>){
  }

  public GetSub<ItemSon extends ItemExt, ItemSub extends ItemExt>(typeClass: { new (): ItemSub; }, obj : ItemSon) {
      return new ItemCollection<ItemSon, ItemSub>(typeClass, obj, this);
  }
}

export abstract class ItemExt {
  public Id : string;
}

但是编译器在“this”上的方法“GetSub”中给出了一个错误:

  

类型'this'的参数不能分配给类型的参数   'ItemCollection'。类型'ItemCollection'不能分配给'ItemCollection'类型。类型'ItemFather'不能分配给'ItemSon'类型。类型   'ItemExt'不能指定为'ItemSon'类型。

我认为它只是一个语法或解释的麻烦,因为当我使用eval(“this”)注意“this”它按预期工作。

有人可以帮助我在没有评估的情况下获得编译错误吗?

提前致谢

1 个答案:

答案 0 :(得分:0)

问题是构造函数中fatherColl的类型是ItemCollection<ItemFather, ItemSon>,因此当您调用new ItemCollection<ItemSon, ItemSub>(...时,它会强制第三个参数的类型为ItemCollection<ItemSon, ItemSub>因为您已经定义了类型,因此传入父集合中的泛型需要与正在创建的ItemCollection的泛型匹配。

所以基本上你传递ItemCollection<ItemFather, ItemSon>但告诉它应该期待类型ItemCollection<ItemSon, ItemSub>

这两个定义不匹配,因此它正确地说您有类型错误。

如果您只是eval,这样做的原因是,像这样的类型搜索不是Javascript的一部分,纯粹是在TypeScript领域,并且通过将所有内容放入eval调用,您将删除类型检查