有没有办法强制使用Typescript编译器从构造函数返回实例化的实例?目前,缺乏能够找到这样做的方法是让我从子类化Collection type in Typescript。
在inspecting the output from the TypeScript compiler之后我发现编译器在继承我的Collection类型
时会输出以下内容var MyCollection = (function (_super) {
__extends(MyCollection, _super);
function MyCollection() {
_super.apply(this, arguments);
}
return MyCollection;
})(Collection);
它不返回_super.apply(this, arguments);
的结果这一事实使得从Collection类返回数组实例的整个技巧无效。
目前,我能想出的创建可以使用TypeScript编译器的东西的唯一方法就是用JavaScript完成所有工作,然后定义一个围绕该类型的接口......
答案 0 :(得分:1)
您需要执行类似于Collection
类'构造函数中的操作。
将injectClassMethods
函数更改为可以与其他类重用,或者只修改现有函数:
static injectClassMethods(collection, prototype) {
// Loop over all the prototype methods and add them
// to the new collection.
for (var method in prototype) {
// Make sure this is a local method.
if (prototype.hasOwnProperty(method)) {
// Add the method to the collection.
collection[ method ] = prototype[ method ];
}
}
// Return the updated collection.
return( collection );
}
现在你可以像这样编写一个新的扩展类:
class ExtendedCollection extends Collection {
constructor(...items: any[]) {
var s = <any>super();
Collection.injectClassMethods(s, ExtendedCollection.prototype);
Array.prototype.push.apply(s, items);
return s;
}
// Example method
printFirstItem() {
document.write(this[0]);
}
}
请注意,当前的实现正在做类似......
var myCollection = new ExtendedCollection().add("Asdf");
...会导致myCollection
被打字稿键入为Collection
而不是ExtendedCollection
,因为该函数的返回类型为Collection
。
有一个关于here的公开问题。
顺便说一下,我分享了这个要点并制作了a few changes,这样可以更容易继承。另外,我修复了一些错误(比如constructor
和addAll
方法接受多于零的参数而没有编译错误。)