typescript + THREE:类'Vertex'错误地扩展了基类'Vector3'

时间:2017-11-03 16:00:32

标签: typescript typescript-typings

使用带有@ 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'.

1 个答案:

答案 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()

希望有所帮助;祝你好运!