此示例使用继承来扩展原始对象。命名只是为了说明。
class Test {
baseMethod() {
}
}
class TestWithClose extends Test {
close() {
}
}
var t = new TestWithClose();
t.close();
t.baseMethod();
更新
您在评论中提到您可以以您想要的方式为内置函数编写扩展方法,我可以看到您想为自己的代码做同样的事情,但这是不可能的。
我希望这能解释原因。
在 TypeScript 中创建声明时,可以通过添加来扩展该声明。您可以使用 declare 关键字或将文件放在.d.ts
文件中:
例如,如果您在一个文件中有此声明:
declare interface ExampleInterface {
methodOne();
}
您可以在另一个文件中扩展声明:
declare interface ExampleInterface {
methodTwo();
}
因此,当您使用它时,您可以使用这两个功能:
function example(example: ExampleInterface) {
example.methodOne();
example.methodTwo();
}
这些并不是真正的扩展方法——这只是不止一次地告诉编译器一个实现。这对 jQuery 特别有用,因为它允许每个插件都有一个添加到JQuery
接口的定义。
您不能为自己的 TypeScript 代码执行此操作,因为添加到接口会导致所有实现都需要更新以匹配接口定义。
这里的思想转变是 TypeScript 为您提供静态类型,而您正在寻找动态行为 - 所以您必须选择其中一个。例如,您可以只在真正需要的地方使用动态行为,而将其余的保持静态类型:
class Test {
}
// statically typed
var stTest = new Test();
// dynamically typed
var testExtender: any = Test;
testExtender.prototype.close = function() {
alert('Close');
};
var t: any = new Test();
t.close();
这并不是说将来不会在语言中添加一些东西来支持扩展方法。