我想做的与this和this非常相似,只是我试图弄清楚如何将ArrayExtension放入模块中。
我正在尝试获得类似于 C# 扩展方法工作方式的东西,这样我就可以导入模块,我将拥有我的额外方法。我提供的链接显示了如何扩展现有对象,但我无法弄清楚如何将其封装到模块中。
如果您的目标是非浏览器环境,例如 node.js,这将是可能的,因为您将能够将引用传递给模块的全局成员,例如Array
,传递给其他模块。然后,那些其他模块可以扩展传入的对象和/或其原型,并具有只能由调用模块访问的额外功能。其他模块也必须这样做才能获得这些扩展;因此,冲突被最小化,因为导入是明确的。
但是,在浏览器环境中,情况并非如此,因为只有一个window
对象,对其成员的任何更改都可以在任何地方使用。一旦您的任何模块扩展Array
了这些扩展,所有其他模块都可以使用这些扩展——增加了冲突的可能性并使代码更难推理。
话虽如此,JS 中有模式,因此 TypeScript 应该可以完成你想要的。一种这样的模式是“混合”模式,它允许您在对象实例的基础上添加额外的功能。您可以将可重用的代码分离到 mixin 模块中,然后可以在需要时将其应用于对象,甚至可以在构造函数中自动应用。看看这个以获得体面的概述和实施示例:http: //javascriptweblog.wordpress.com/2011/05/31/a-fresh-look-at-javascript-mixins/
如果您尝试扩展内置 Array 类型,则无法在模块中执行此操作。您的扩展将需要存在于 ArrayEx.ts 文件中并出现在任何模块之外。这样做的原因是,如果您在模块中执行此操作,您将扩展Foo.Array
与Array
.
但是您说您只是希望能够导入模块以显示您的额外方法,而您真正需要做的就是将一个添加/// <reference path='ArrayEx.ts' />
到您希望扩展方法可用的任何文件中。这本质上是一样的。