如何在 TypeScript 中实现 clone() 方法?
How could one implement clone() method in TypeScript?
假设有一个classAbstractCollection
可能有很多子class,它们有相似的构造函数(接受条目)。是否可以在 AbstractCollection
中实现 clone()
方法,这将创建并 return 实际子 class 的新实例,并传入条目?
class AbstractCollection<T> {
constructor(items: T[]) {
// ...
}
clone(): AbstractCollection<T> {
// TODO: implement
}
}
没问题,你要找的是 this.constructor
:
class AbstractCollection<T> {
private items: T[];
constructor(items: T[]) {
this.items = items;
}
clone(): AbstractCollection<T> {
return new (this.constructor as { new(items: T[]): AbstractCollection<T>})(this.items);
}
}
然后:
class MyCollection1 extends AbstractCollection<string> {}
class MyCollection2 extends AbstractCollection<number> { }
let a = new MyCollection1(["one", "two", "three"]);
let clonedA = a.clone();
console.log(clonedA); // MyCollection1 {items: ["one", "two", "three"]}
let b = new MyCollection2([1, 2, 3]);
let clonedB = b.clone();
console.log(clonedB); // MyCollection2 {items: [1, 2, 3]}
假设有一个classAbstractCollection
可能有很多子class,它们有相似的构造函数(接受条目)。是否可以在 AbstractCollection
中实现 clone()
方法,这将创建并 return 实际子 class 的新实例,并传入条目?
class AbstractCollection<T> {
constructor(items: T[]) {
// ...
}
clone(): AbstractCollection<T> {
// TODO: implement
}
}
没问题,你要找的是 this.constructor
:
class AbstractCollection<T> {
private items: T[];
constructor(items: T[]) {
this.items = items;
}
clone(): AbstractCollection<T> {
return new (this.constructor as { new(items: T[]): AbstractCollection<T>})(this.items);
}
}
然后:
class MyCollection1 extends AbstractCollection<string> {}
class MyCollection2 extends AbstractCollection<number> { }
let a = new MyCollection1(["one", "two", "three"]);
let clonedA = a.clone();
console.log(clonedA); // MyCollection1 {items: ["one", "two", "three"]}
let b = new MyCollection2([1, 2, 3]);
let clonedB = b.clone();
console.log(clonedB); // MyCollection2 {items: [1, 2, 3]}