打字稿:向现有抽象类添加其他重载

精英大师埃里克

我正在为Leaflet.Editable包开发一组DefinitelyTyped的定义。Leaflet值得注意的是,它使用部分自定义的类实现,以允许在纯JavaScript中扩展现有类型,如此处所示只需import 'Leaflet.Editable'在代码中的任意位置调用即可为现有的Leaflet类添加新功能,例如启用和禁用某些图层的编辑的功能。

它不是在TypeScript中实现的,因此键入是在@ types / leaflet中实现的,因此我正在开发的包(@ types / leaflet-editable)必须导入传单名称空间并扩展现有类型。

我必须扩展现有的类型,而不是添加新的类型,因为还有其他使用这些类型的库(例如react-leaflet)。

例如,通过扩展MapOptions类型(通过合并接口),我能够为react-leafletMapComponent组件添加新属性,因为它的道具可以扩展Leaflet.MapOptions如果要创建一个新类型,EditableMapOptions则不会对其进行扩展react-leaflet,因此无法将这些属性添加到中MapComponent

我能够扩展几个现有的接口,并添加新的接口,例如VertexEventHandlerFn(代表提供的事件回调VertexEvent)。

问题是如何@types/leaflet实现map.on('click', (event: LeafletEvent) => {})功能。这是DefinitelyTyped回购的一个片段

export abstract class Evented extends Class {
    /**
     * Adds a listener function (fn) to a particular event type of the object.
     * You can optionally specify the context of the listener (object the this
     * keyword will point to). You can also pass several space-separated types
     * (e.g. 'click dblclick').
     */
    // tslint:disable:unified-signatures
    on(type: string, fn: LeafletEventHandlerFn, context?: any): this;
    on(type: 'baselayerchange' | 'overlayadd' | 'overlayremove',
        fn: LayersControlEventHandlerFn, context?: any): this;
    on(type: 'layeradd' | 'layerremove',
        fn: LayerEventHandlerFn, context?: any): this;
    ...

如您所见,它使用一个抽象类,该类为用户何时包含多个用空格分隔的事件以及几个特定事件(当提供特定参数时,为其事件处理程序包括正确的类型)提供了通用定义。

我想向其中添加函数,但找不到任何方法可以向现有抽象类添加其他重载。这里要注意的是,所有这些重载on都由Leaflet中的同一行代码实现,因此此处不存在通过向抽象类添加新方法(以后不会由关联的JavaScript实现)所面临的问题。

我只是尝试尝试重新声明abstract class Evented向其添加更多方法,但TypeScript告诉我它已经定义。我的研究仅发现TypeScript文档,该文档指示我应该使用mixins,因为我需要修改现有的类,而创建一个新的类并不能解决问题,所以我不能这样做。

到目前为止,这是我目前对传单可编辑的TypeScript实现。

贾卡尔兹

模块扩充文档中可能不清楚,但是如果您想合并到一个named实例类型中class,可以通过添加interface与相同的名字来实现class当您编写时class Foo {},它将类型命名Foo为接口,您可以将其合并。例如:

import { Draggable, LeafletEvent } from 'leaflet';

interface PeanutButterEvent extends LeafletEvent {
  chunky: boolean
}

declare module 'leaflet' {
  interface Evented {
    on(type: "peanut-butter", fn: (x: PeanutButterEvent) => void): this;
  }
}

const draggable = new Draggable(new HTMLElement()) // whatever
draggable.on("peanut-butter", e => console.log(e.chunky ? "Chunky" : "Creamy")); // ok
draggable.on("resize", e => console.log(e.oldSize)); // still works

在这里,我on()interfacenamed添加了另一个重载Evented


另一方面,如果您想合并为的静态类型,则class可以通过添加namespace与相同名称的来实现class当您编写时class Foo {},它会将命名Foo值的值视为一个名称空间,您可以将其合并到其中。例如:

import { Draggable, Evented } from 'leaflet';

declare module 'leaflet' {
  namespace Evented {
    export function hello(): void;
  }
}
Evented.hello = () => console.log("hello"); // implement if you want
Draggable.hello(); // okay
Draggable.mergeOptions({}); // still works

在这里,我将另一个静态方法添加hello()namespacenamed中Evented

操场上的代码链接

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

抽象类是否可以具有其他抽象类的返回类型的方法?

来自分类Dev

如何在打字稿中使用带有模板的抽象类并调用它

来自分类Dev

依赖注入抽象类打字稿(Angular2)

来自分类Dev

打字稿类型、泛型和抽象类

来自分类Dev

有什么方法可以实现抽象类,它是从 C++ 中的其他抽象类多重继承的?

来自分类Dev

如何将现有打字稿和其他必要文件从现有项目添加(复制和粘贴)到使用angular-cli创建的新项目中?

来自分类Dev

打字稿:声明现有类的功能

来自分类Dev

重载抽象类中的抽象方法

来自分类Dev

接口,抽象类或其他方法java

来自分类Dev

Ruby中的整数和其他(?)抽象类

来自分类Dev

从打字稿中具有相同父类的其他实例访问受保护的方法

来自分类Dev

在没有vtable开销的情况下将抽象类实现为其他类的接口

来自分类Dev

当现有元素只有类,没有 ID 时,jQuery/Javascript 向其他元素添加唯一元素

来自分类Dev

c'tor和d'tor从抽象基础到其他抽象类的继承到具体

来自分类Dev

向现有的Linq查询添加其他WHERE子句

来自分类Dev

如何首先从数据库EF模型向现有代码添加其他表?

来自分类Dev

向现有关系添加其他记录不起作用

来自分类Dev

如何从外部API向集合中的现有模型添加其他数据?

来自分类Dev

向现有的Linq查询中添加其他WHERE子句

来自分类Dev

向现有的多对多关系中添加其他列-EF代码优先

来自分类Dev

向现有授权添加其他Windows Azure AD委托权限

来自分类Dev

没有抽象类的抽象方法

来自分类Dev

如何将JPanel从其他类添加到现有Frame

来自分类Dev

使用子非抽象类向抽象类中的非抽象方法插入值

来自分类Dev

抽象类的继承使用为属性定义的其他类型

来自分类Dev

从其他类向类动态添加静态函数

来自分类Dev

在打字稿中使用其他类的函数创建类实例

来自分类Dev

抽象类(接口)中的运算符重载

来自分类Dev

C ++-重载接受抽象类的运算符

Related 相关文章

  1. 1

    抽象类是否可以具有其他抽象类的返回类型的方法?

  2. 2

    如何在打字稿中使用带有模板的抽象类并调用它

  3. 3

    依赖注入抽象类打字稿(Angular2)

  4. 4

    打字稿类型、泛型和抽象类

  5. 5

    有什么方法可以实现抽象类,它是从 C++ 中的其他抽象类多重继承的?

  6. 6

    如何将现有打字稿和其他必要文件从现有项目添加(复制和粘贴)到使用angular-cli创建的新项目中?

  7. 7

    打字稿:声明现有类的功能

  8. 8

    重载抽象类中的抽象方法

  9. 9

    接口,抽象类或其他方法java

  10. 10

    Ruby中的整数和其他(?)抽象类

  11. 11

    从打字稿中具有相同父类的其他实例访问受保护的方法

  12. 12

    在没有vtable开销的情况下将抽象类实现为其他类的接口

  13. 13

    当现有元素只有类,没有 ID 时,jQuery/Javascript 向其他元素添加唯一元素

  14. 14

    c'tor和d'tor从抽象基础到其他抽象类的继承到具体

  15. 15

    向现有的Linq查询添加其他WHERE子句

  16. 16

    如何首先从数据库EF模型向现有代码添加其他表?

  17. 17

    向现有关系添加其他记录不起作用

  18. 18

    如何从外部API向集合中的现有模型添加其他数据?

  19. 19

    向现有的Linq查询中添加其他WHERE子句

  20. 20

    向现有的多对多关系中添加其他列-EF代码优先

  21. 21

    向现有授权添加其他Windows Azure AD委托权限

  22. 22

    没有抽象类的抽象方法

  23. 23

    如何将JPanel从其他类添加到现有Frame

  24. 24

    使用子非抽象类向抽象类中的非抽象方法插入值

  25. 25

    抽象类的继承使用为属性定义的其他类型

  26. 26

    从其他类向类动态添加静态函数

  27. 27

    在打字稿中使用其他类的函数创建类实例

  28. 28

    抽象类(接口)中的运算符重载

  29. 29

    C ++-重载接受抽象类的运算符

热门标签

归档