TypeScript中的简单扩展方法

时间:2012-11-05 09:16:10

标签: typescript

我正在尝试为类创建扩展方法,但似乎有些不对劲。下面是代码,输出JS文件是正确的,但编译器两次显示错误“test.ts(10,16):属性'close'在类型'Test'的值上不存在”< /强> 应该纠正什么?

class Test {
} 

interface Test
{
    close():any;
}

Test.prototype.close  = function() {}

var t = new Test();

t.close();

更新:上面的代码可以使用内置类型进行编译。我需要扩展自己的类。

更新2 :旧的编译器版本问题。目前一切都还可以!

1 个答案:

答案 0 :(得分:5)

此示例使用继承来扩展原始对象。命名只是为了说明。

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();

这并不是说将来不会添加某些语言来支持扩展方法。