TypeScript中的简单扩展方法
我试图为类创建一个扩展方法,但似乎有些地方出了问题。下面是代码,输出JS文件是正确的,但编译器两次显示错误“test.ts(10,16):“test”类型的值上不存在属性“close” 应该纠正什么TypeScript中的简单扩展方法,typescript,Typescript,我试图为类创建一个扩展方法,但似乎有些地方出了问题。下面是代码,输出JS文件是正确的,但编译器两次显示错误“test.ts(10,16):“test”类型的值上不存在属性“close” 应该纠正什么 class Test { } interface Test { close():any; } Test.prototype.close = function() {} var t = new Test(); t.close(); 更新:上面的代码可以使用内置类型编译。我需要扩展
class Test {
}
interface Test
{
close():any;
}
Test.prototype.close = function() {}
var t = new Test();
t.close();
更新:上面的代码可以使用内置类型编译。我需要扩展我自己的课程
更新2:旧编译器版本问题。现在一切都好 此示例使用继承来扩展原始对象。命名只是为了举例说明
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();
这并不是说将来不会在语言中添加支持扩展方法的内容。这不是我想要的。如果我扩展I.e.数组,我将能够通过数组实例调用new metod:`myArrayInstance.newArrayMethod(1,2,3)第一个变量是灾难。这只是无法维护的代码,我最好还是用JS。@MadHollander我已经对我的答案做了进一步的解释。我还有一个比我最初的第一个示例更好的建议,所以我删除了它。“这里的思想转变是TypeScript给了你静态的输入,你在寻找动态的行为”——这不完全正确,typescript还引入了一些编译为本机JS的sugar语法。@Alex本段涉及静态类型与动态类型。这并不意味着TypeScript只提供静态类型,但这似乎就是您对它的解释。事实上,它允许静态和动态类型(以及许多其他功能)