【发布时间】:2014-06-06 16:40:11
【问题描述】:
我有一个名为 Leaflet 的 JS 库,它有一个现有的 TypeScript 定义文件。
我希望使用一个插件来扩展传单中的一些对象并具有额外的功能。
在现有的 TypeScript 定义文件中,对象被定义为类而不是接口。
例如
declare module L {
function circleMarker(latlng: LatLng, options?: PathOptions): CircleMarker;
export class CircleMarker extends Circle {
constructor(latlng: LatLng, options?: PathOptions);
setLatLng(latlng: LatLng): CircleMarker;
setRadius(radius: number): CircleMarker;
toGeoJSON(): any;
}
}
如果我尝试在单独的文件中再次定义它,则会收到有关“重复标识符 'CircleMarker'”的错误。
declare module L {
export class CircleMarker {
bindLabel(name: string, options: any): CircleMarker;
}
}
这是有道理的,因为它是一个类而不是一个接口,但既然如此,有没有办法在不更改原始定义文件的情况下扩展这个类定义?
基本定义文件是通过nuget从DefiniteTyped中提取的,所以我非常希望不要对其进行任何更改,因为它会使更新更加尴尬/容易失败。
【问题讨论】:
-
现在我只是绕过了烦人但可行的类型检查。 (
marker).bindLabel("Hello World", { }); -
您基本上是在尝试使“部分”工作(例如在 C# 中),这不是 TypeScript 的功能。这在脚本语言中并不简单,因为所有内容都没有像 .NET 程序集那样很好地打包。
-
WiredPrairie:C# 等价物将是部分接口,因为这是关于类型定义而不是实际实现。 Typescript 已经为接口 blogs.msdn.com/b/typescript/archive/2013/01/24/… 支持此功能,“TypeScript 中的接口是开放的,这意味着您可以通过简单地编写另一个接口块来将自己的成员添加到接口中。”但它目前不适用于课程。我怀疑这是出于可用性/设计原因,而不是 .Net 元数据更好。
-
我了解 C# 部分 - 并且缺乏实际的 TypeScript 部分。但是,
CircleMarker类不是interface,所以我看不出它有什么关系。挑战在于接口只是 TypeScript 中的编译时检查,因此可以“扩展”它们。然而,类是一种实际的 JavaScript 构造,而且要干净、一致地扩展要复杂得多。 -
这很重要,因为我正在为现有的 JS 代码创建一个定义,而不是实现我自己的。理想情况下,制作原始定义文件的人应该使用接口,但他们没有,我现在被困在试图解决他们的设计选择。有很多关于让类像接口一样开放的票,typescript.codeplex.com/workitem/917。
标签: typescript