TypeScript中的简单扩展方法

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(); 更新:上面的代码可以使用内置类型编译。我需要扩展

我试图为类创建一个扩展方法,但似乎有些地方出了问题。下面是代码,输出JS文件是正确的,但编译器两次显示错误“test.ts(10,16):“test”类型的值上不存在属性“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只提供静态类型,但这似乎就是您对它的解释。事实上,它允许静态和动态类型(以及许多其他功能)