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

引发打字错误:Type '(new (...args: any[]) => any) & typeof Class' is missing the following properties from type 'typeof CustomControl': Zoom, Attribution, Layers, Scale, and 6 more.
这似乎是由于 namespace 和类Control通过Typescript的声明合并而发生的。这导致CustomControl需要 namespace 中的属性,而不仅仅是类。

有没有一种方法可以解决这个问题,或者在不强制any类型的情况下规避它?

最佳答案

我们需要为方法“extend”添加更多类型。

在您的控件声明之前插入此代码

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;
  }
}

您可以为处理程序添加相同的声明

关于typescript - 如何定义自定义传单控件的类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56639406/

10-12 14:09
查看更多