Как определить тип пользовательского элемента управления листовки - PullRequest
11 голосов
/ 18 июня 2019

При просмотре определений типов из @types/leaflet вы можете увидеть пользовательские элементы управления, определенные следующим образом:

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

Однако при создании пользовательского элемента управления с помощью:

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

throwsошибка машинописного текста: Type '(new (...args: any[]) => any) & typeof Class' is missing the following properties from type 'typeof CustomControl': Zoom, Attribution, Layers, Scale, and 6 more.

Кажется, это происходит потому, что пространство имен и класс Control проходят через объединение объявлений Typescript.Это заставляет CustomControl требовать свойства из пространства имен, а не только из класса.

Есть ли способ исправить это или обойти его, не вызывая тип any?

1 Ответ

0 голосов
/ 04 июля 2019

Нам нужно добавить дополнительные наборы для метода "extended".

Вставьте этот код перед объявлением элемента управления

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

Для членов

declare module 'leaflet' {
  namespace Control {

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

Вы можетедобавить такую ​​же декларацию для обработчика

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...