通用类不尊重类型

时间:2019-07-07 19:41:24

标签: typescript

我有以下代码:

class AugmentedSet<T>{
    private set: Set<T> = new Set<T>();

    add (item: any){
        this.set.add(item)
        item._parent = this;
    }
}

class Foo{}
class Bar{}

const foo = new Foo()
const bar = new Bar();
const augSet = new AugmentedSet<Foo>();
augSet.add(foo);
augSet.add(bar); // should not work, different type

我正在尝试创建一个扩展Set类的类。由于本示例中未显示的各种原因,我既不想扩展Set,也不想修改文字Set原型。相反,我只想创建一个键入的Set类对象。

我希望发生的是打字稿,只允许通过AugmentedSet.add()添加Foo类,但是似乎允许Foo和Bar。

我可能不了解如何正确键入此类/方法,因此我在这里寻找任何指导。 :)

1 个答案:

答案 0 :(得分:2)

在您的示例中,

FooBar由于结构类型而可以彼此分配,并且它们具有相同的属性集。您可以尝试:

let foo: Foo = new Bar() ; // will typecheck

这也是您的Set<Foo>也接受Bar的原因。只需在Foo和Bar类中添加一些不同的方法,即可获得预期的行为。

编辑 @Silvio在评论中注意到我没有做某事,这是另一个更直接的原因。必须同时考虑两者才能获得预期的行为。