打字稿等于

Tra*_*ace 4 javascript typescript

如何在 Typescript 中实现 equals?
我尝试了几种方法,都没有效果。

选项1:

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

class GNode extends GTreeObject<GNode>{ 
    public equals(obj: GNode){ 
        //Implement 
    } 
} 
Run Code Online (Sandbox Code Playgroud)

结果:通用类型“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 
    } 
} 
Run Code Online (Sandbox Code Playgroud)

如何可靠解决?

T.J*_*der 5

根据 TypeScript 游乐场,唯一的问题是您忘记声明equalsin实现的返回类型GNode

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

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

这个完整的例子是有效的,例如:

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
Run Code Online (Sandbox Code Playgroud)

回复您的评论:

抱歉给您带来麻烦。这似乎适用于GNode,但在实施时GTree

class GTree<T> extends GTreeObject<GTree>
Run Code Online (Sandbox Code Playgroud)

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

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

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