如何在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
}
}
如何可靠地解决?
答案 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;
}
}