1 回答
TA贡献1946条经验 获得超3个赞
这里的核心问题是,您希望返回在超类上实现克隆函数,该超类返回正在复制的任何子类实例。
首先,您需要返回类型 ,这意味着该方法返回与实例相同的类型。this
其次,您希望调用与此类相同的构造函数。除非我弄错了,否则typescript不会让这变得容易。的类型只是 ,而不是您可能期望的类构造函数。但是,您可以以一种提供相当强大的类型安全性的方式强制使用它。someInstance.constructorFunction
class A {
constructor(public data: string) { }
deepCopy<
// This generic argument will be the type of the class object
// that this is an instance of. It must be a subclass of A.
T extends typeof A
>(): this {
// Get the constructor as the constructor of some subclass of A.
const constructor = this.constructor as T
// Create the new instance as the same type as `this`.
const newInstance = new constructor(this.data) as this
// return the copy.
return newInstance
}
}
class B extends A {}
const b1 = new B('some data here')
const b2: B = b1.deepCopy() // works
操场
泛型参数表示函数中将是某个构造函数,该构造函数是 A 的子类。我们真的不在乎哪一个。T extends typeof AT
然后,我们可以简单地强制一些类型脚本无法推断的强制转换。
但是,这种类型安全性崩溃的地方是,如果子类具有不同的构造函数签名,这可能会中断,因为不知道如何调用它们。deepCopy
添加回答
举报