打字稿等于

时间:2016-11-24 09:05:00

标签: javascript typescript

如何在Typescript中实现equals?
我尝试过几种方法,都没用。

选项1:

abstract class GTreeObject<T>{ 
    abstract equals(obj: T): boolean; 
} 

class GNode extends GTreeObject<GNode>{ 
    public equals(obj: GNode){ 
        //Implement 
    } 
} 

结果:通用类型'GNode'需要1个类型的参数。

选项2会涉及在运行时进行投射,但如何进行投射?:

abstract class GTreeObject{ 
    abstract equals(obj: Object): boolean; 
} 

class GNode extends GTreeObject{ 
    //How to cast Object to GNode?? 
    public equals(obj: Object){ 
        //Implement 
    } 
} 

如何可靠地解决?

1 个答案:

答案 0 :(得分:4)

根据TypeScript游乐场,唯一的问题是您忘记在equals中声明GNode实施的返回类型:

abstract class GTreeObject<T>{ 
    abstract equals(obj: T): boolean; 
} 

class GNode extends GTreeObject<GNode>{ 
    public equals(obj: GNode) : boolean { 
    // ----------------------^^^^^^^^^^
        return /*implementation*/true;
    } 
}

这个完整的例子有用,例如:

abstract class GTreeObject<T>{ 
    abstract equals(obj: T): boolean; 
} 

class GNode extends GTreeObject<GNode>{
    private value: number;

    public constructor(value: number) {
        super();
        this.value = value;
    }
    public equals(obj: GNode) : boolean { 
        return this.value === obj.value;
    } 
} 

let g1 : GNode = new GNode(42);
let g2 : GNode = new GNode(42);
let g3 : GNode = new GNode(27);
console.log(g1.equals(g2)); // true
console.log(g1.equals(g3)); // false

重新评论:

  

抱歉麻烦。这似乎适用于GNode,但在实施GTree时:

class GTree<T> extends GTreeObject<GTree>
     

这似乎导致错误:通用类型'GTree'需要1个类型的参数。在类定义中使用两个泛型类型是否存在问题(采用+传递泛型)?

您需要将GTreeObject的类型参数声明为GTree<T>,而不仅仅是GTree

class GTree<T> extends GTreeObject<GTree<T>> {
// -------------------------------------^^^
    public equals(obj: GTree<T>) : boolean { 
    // ---------------------^^^
        return /*implementation*/true;
    } 
}