2016-11-24 5 views
1

Comment implémenter des équals dans Typescript?
J'ai essayé quelques méthodes, les deux ne fonctionnaient pas.Typescript est égal à

Option 1:

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

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

Résultats dans: Type générique 'GNode' exige 1 argument de type (s).

Option 2 impliquerait la coulée lors de l'exécution, mais comment faire le casting ?:

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

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

Comment résoudre de manière fiable?

Répondre

3

Selon la cour de récréation dactylographiée, le seul problème est que vous avez oublié de déclarer le type de retour de votre mise en œuvre de equals dans GNode:

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

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

Cet exemple complet fonctionne, par exemple:

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 

Re votre commentaire:

Sorry for the hassle. This seems to work for GNode , but when implementing GTree :

class GTree<T> extends GTreeObject<GTree> 

this seems to result in an error: Generic type 'GTree' requires 1 type argument(s). Is there a problem using two generic types in the class definition (taking + passing a generic)?

Vous auriez besoin de déclarer le paramètre de type à GTreeObject comme GTree<T>, non seulement GTree:

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

Désolé pour les tracas. Cela semble fonctionner pour GNode, mais lors de l'implémentation de GTree: 'la classe GTree extends GTreeObject ' cela semble aboutir à une erreur: 'Le type générique 'GTree ' nécessite 1 argument (s) type.' Y at-il un problème en utilisant deux types génériques dans la définition de classe (prendre + passer un générique)? – Trace

+0

Fyi Je passe un GNode au GTree comme type générique. – Trace

+0

@KimGysen: Vous devez être cohérent sur les types, c'est tout. :-) 'GTree ' plutôt que 'GTree', voir la mise à jour ci-dessus. –