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
