typescript - Hvordan definere typen til en tilpasset leaflet-kontroll


Når du ser gjennom typedefinisjonene fra @types/leaflet, kan du se egendefinerte kontroller definert på en lignende måte som:

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

Men når du lager din egendefinerte kontroll gjennom:

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({
    ...
});

gir en TypeScript-feil: Type '(new (...args: any[]) => any) & typeof Class' mangler følgende egenskaper fra typen 'typeof CustomControl': Zoom, Attribution, Layers, Scale, og 6 til.

Dette ser ut til å skje fordi navnerommet og klassen Control går gjennom Typescripts deklarasjons-sammenslåing. Dette gjør at CustomControl krever egenskaper fra navnerommet i stedet for bare klassen.

Finnes det en måte å fikse dette på eller omgå det uten å tvinge typen any?

Svar #1

Vi trenger å legge til flere typings for metoden "extend".

Sett inn denne koden før deklarasjonen av kontrollen din

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

Med medlemmer

declare module 'leaflet' {
  namespace Control {

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

Du kan legge til samme erklæring for Handler

Relaterte artikler