我有一个案例,我需要在不同类别的项目之间获得层次结构。它们都扩展了相同的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”它按预期工作。
有人可以帮助我在没有评估的情况下获得编译错误吗?
提前致谢
答案 0 :(得分:0)
问题是构造函数中fatherColl
的类型是ItemCollection<ItemFather, ItemSon>
,因此当您调用new ItemCollection<ItemSon, ItemSub>(...
时,它会强制第三个参数的类型为ItemCollection<ItemSon, ItemSub>
因为您已经定义了类型,因此传入父集合中的泛型需要与正在创建的ItemCollection
的泛型匹配。
所以基本上你传递ItemCollection<ItemFather, ItemSon>
但告诉它应该期待类型ItemCollection<ItemSon, ItemSub>
。
这两个定义不匹配,因此它正确地说您有类型错误。
如果您只是eval
,这样做的原因是,像这样的类型搜索不是Javascript的一部分,纯粹是在TypeScript领域,并且通过将所有内容放入eval
调用,您将删除类型检查