使用带有@ types / three定义的三个库
尝试创建自己的类扩展THREE.Vector3
def __str__()
但收到错误:
export class Vertex extends THREE.Vector3 { constructor( x:number, y:number, z:number, public normal:THREE.Vector3 = new THREE.Vector3(), public uv:THREE.Vector2 = new THREE.Vector2()) { super(x,y,z); } clone():Vertex { return new Vertex(this.x, this.y, this.z, this.normal.clone(), this.uv.clone()); }
属性'clone'的类型不兼容。 输入'()=> “顶点”不能指定为“()=>类型这个'。 “顶点”类型无法指定为“此”类型。
在THREE定义vector3中定义为:
TS2415: Class 'Vertex' incorrectly extends base class 'Vector3'.
答案 0 :(得分:1)
看起来clone()
的{{1}}方法使用polymorphic this
作为其返回类型。这意味着Vector3
的每个子类/实现都需要其Vector3
方法来返回非常子类的实例。乍看之下,您似乎正在使用clone()
执行此操作,因为您要返回Vertex
。但是如果我这样做会怎么样:
Vertex
请注意export class SillyVertex extends Vertex {
sillinessFactor: boolean = true;
constructor()
super(0, 0, 0, new THREE.Vector3(), new THREE.Vector2());
}
}
是SillyVertex
的子类,但它从Vertex
继承了clone()
方法。因此,虽然Vertex
应根据(new SillyVertex()).clone()
的定义返回SillyVertex
,但它将是Vector3
。这不正确。
如果您知道某个人无法进入Vertex
的子类,您可以始终保留Vertex
返回类型并在正文中执行类型断言:
this
有no final
keyword标记一个类是不可扩展的,但添加私有构造函数或属性将具有相同的效果。
如果你做想要继承clone(): this {
return new Vertex(this.x, this.y, this.z, this.normal.clone(), this.uv.clone()) as this;
}
,那么你需要一个更通用的Vertex
方法来处理所有可能的子类(一般来说很难做到,但也许像Object.assign()
这样的东西可以帮助你)或者小心在每个子类中正确实现clone()
。
希望有所帮助;祝你好运!