2017-01-23 1 views
0

Je suis en train de tester FlowJS pour mon projet, et j'ai un problème avec Type Aliases.FlowJS: types héritage

Je construire un SDK Web pour une API: J'ai une classe Helper avec cette méthode:

class Helper { 
    find(filters:PaginationOptions = {}) { 
     // ... 
    } 
} 

PaginationOptions est un type FlowJS de base:

type PaginationOptions = { 
    start?:string, 
    end?:number, 
}; 

J'ai aussi une aide pour les utilisateurs , héritant de Helper:

class UsersHelper extends Helper { 
    find(filters:UsersFilterOptions = {}) { 
     // ... 
    } 
} 

UsersFilterOptions est un type FlowJS « extension » PaginationOptions:

type UsersFilterOptions = { 
    username?:string, 
    city?:string, 
} & PaginationOptions; 

J'utilise ici un Intersection pour que mes filtres utilisateurs doivent également accepter start et end propriétés.

Il semble que mon IDE (PHPStorm) n'aime pas ma méthode find() de ma classe UsersHelper, il continue à me dire que:

commande non compatible, devrait avoir le type 'PaginationOptions'

Eh bien ... Je sais, c'est pourquoi UsersFilterOptions a une intersection avec PaginationOptions.

Mais FlowJS me montre aussi deux avertissements autres:

Débit: propriété username. Propriété introuvable dans le littéral d'objet
Flux: propriété city. Propriété non trouvée dans l'objet

littéral

Je ne comprends pas pourquoi j'ai ces erreurs: ces propriétés sont définies en option ...

Avez-vous des suggestions pour la fixation de ces trois erreurs?

Merci d'avance!

+0

@ nat-mote Puis-je savoir pourquoi la balise 'flow-js' a été supprimée? Cette question concerne totalement 'flow-js', c'est un non-sens pour moi de supprimer cette balise ... – KorHosik

+0

Regardez la description de cette balise, c'est pour un projet différent qui n'est pas le vérificateur de type de flux. Le tag pour ce que vous voulez est flowtype: http://stackoverflow.com/tags/flow-js/info –

+0

Ok, merci pour l'information :) – KorHosik

Répondre

2

Lorsque vous remplacez une méthode, il est des arguments doivent être supertypes d'arguments correspondants de la classe de base, vous pouvez le faire:

class A { 
    test(x: number) { 
    } 
} 

class B extends A { 
    test(x: number | string) { 
    } 
} 

Mais vous ne pouvez pas faire ceci:

class A { 
    test(x: number | string) { 
    } 
} 

class B extends A { 
    test(x: number) { 
    } 
} 
+0

Merci pour votre réponse :) Ce comportement est assez étrange à mon avis, mais pourquoi pas ... Une idée de comment résoudre mon problème et rendre le compilateur heureux? – KorHosik