11 votes

Comment définir le type d'un contrôle de feuillet personnalisé ?

En regardant les définitions de type de @types/leaflet vous pouvez voir des contrôles personnalisés définis de manière similaire :

export namespace Control {
    ...
    class Zoom extends Control {
        constructor(options?: ZoomOptions);
        options: ZoomOptions;
    }
    ...
}

Cependant, lorsque vous créez votre contrôle personnalisé par le biais de :

declare module 'leaflet' {
    namespace Control {
        class CustomControl extends Control {
            constructor(options: CustomOptions);
        }
    }
    namespace control {
        function customControl(options: CustomOptions): Control.CustomControl;
    }
}

L.Control.CustomControl = L.Control.extend({
    ...
});

lance une erreur de typographie : Type '(new (...args: any[]) => any) & typeof Class' is missing the following properties from type 'typeof CustomControl': Zoom, Attribution, Layers, Scale, and 6 more.

Cela semble se produire parce que l'espace de nom et la classe Control passer par la fusion des déclarations de Typescript. Cela entraîne CustomControl pour exiger les propriétés de l'espace de nom plutôt que de la classe.

Y a-t-il un moyen de corriger ce problème ou de le contourner sans forcer la saisie ? any ?

1voto

Nous devons ajouter plus de typages pour la méthode "extend".

Insérez ce code avant votre déclaration de contrôle

declare module 'leaflet' {
  namespace Control {
    function extend(props: any): {new(...args: any[]): any} & typeof Control;
  }
}

Avec les membres

declare module 'leaflet' {
  namespace Control {

    function extend<T extends Object>(props: T): {new(...args: any[]): T} & typeof Control;
  }
}

Vous pouvez ajouter la même déclaration pour le Handler

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X