打字稿中的简单扩展方法



我正在尝试为类创建一个扩展方法,但似乎有问题。以下是代码,输出js文件是正确的,但编译器两次显示错误" test.ts(10,16):属性'CLOSE'S CLOSE'不存在于类型'test'的值'test''应该纠正什么?

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

update

您在评论中提到,您可以按照您想要的方式编写内置功能的扩展方法,我可以看到您想为自己的代码做同样的事情,但这是不可能的。p>我希望这解释原因。

当您在打字稿中创建声明时,您可以通过添加到它来扩展该声明。您可以使用声明关键字或将文件放入.d.ts文件中:

例如,如果您在一个文件中有此声明:

declare interface ExampleInterface {
    methodOne();
}

您可以将声明扩展到另一个文件中:

declare interface ExampleInterface {
    methodTwo();
}

因此,当您使用它时,您都有两个功能:

function example(example: ExampleInterface) {
    example.methodOne();
    example.methodTwo();
}

这些并不是真正的扩展方法 - 这只是告诉编译器多个以上的实现。这对于jQuery特别有用,因为它允许每个插件具有添加到JQuery接口的定义。

您无法为自己的打字稿代码执行此操作,因为添加到接口将导致所有实现需要更新以匹配接口定义。

这里的思维方式是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();

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

最新更新