TypeScript扩展模块中的对象

时间:2012-10-11 00:52:57

标签: object module extend typescript

我想做的事情与thisthis非常相似,只是我想弄清楚如何将ArrayExtension放在模块中。

我正在尝试获得类似于C#扩展方法的工作方式,这样我就可以导入模块,我将拥有额外的方法。我提供的链接显示了如何扩展现有对象,但我无法弄清楚如何将其封装到模块中。

2 个答案:

答案 0 :(得分:1)

如果您的目标是非浏览器环境,例如node.js,那么这将是可能的,因为您可以将对模块的全局成员(例如Array)的引用传递给其他模块。然后,那些其他模块可以使用额外的功能扩展传入的对象和/或其原型,这些功能只能由调用模块访问。其他模块必须这样做才能获得这些扩展;因此,由于进口是明确的,因此冲突最小化。

但是,在浏览器环境中并非如此,因为只有一个window对象,并且对其成员的任何更改都可用。只要您的任何模块扩展Array,所有其他模块都可以使用这些扩展 - 增加冲突的可能性并使代码更难以推理。

话虽如此,JS中有模式,因此TypeScript可以实现您想要的效果。其中一种模式是'mixin'模式,它允许您在对象实例的基础上添加额外的功能。您可以将可重用的代码分成mixin模块,然后可以在需要时将其应用于对象,甚至可以在构造函数中自动应用。看一下这个体面的概述和实现示例:http://javascriptweblog.wordpress.com/2011/05/31/a-fresh-look-at-javascript-mixins/

答案 1 :(得分:0)

如果您尝试扩展内置数组类型,则无法在模块中执行此操作。您的扩展需要存在于ArrayEx.ts文件中,并且发生在任何模块之外。这样做的原因是,如果您在模块中执行此操作,则会扩展与Foo.Array不同的Array类型。

但是你说你只是希望能够导入模块以显示你的额外方法,而你真正需要做的就是将/// <reference path='ArrayEx.ts' />添加到你希望扩展方法可用的任何文件中。这基本上是一回事。