我有以下代码:
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。
我可能不了解如何正确键入此类/方法,因此我在这里寻找任何指导。 :)
答案 0 :(得分:2)
Foo
和Bar
由于结构类型而可以彼此分配,并且它们具有相同的属性集。您可以尝试:
let foo: Foo = new Bar() ; // will typecheck
这也是您的Set<Foo>
也接受Bar
的原因。只需在Foo和Bar类中添加一些不同的方法,即可获得预期的行为。
编辑 @Silvio在评论中注意到我没有做某事,这是另一个更直接的原因。必须同时考虑两者才能获得预期的行为。