我想编写类似
的代码class Place {
next: Place;
get to() : Place {
return this;
}
}
let places : Place[]= [];
..
places[0].to.next = new Place();
有很多类似的类,所以我想为Object.prototype定义'to'属性。
Object.defineProperty(Object.prototye,"to",{
get: function() {
return this;
}
});
但是由于Property 'next' does not exist on type 'Object'
我可以使用Object.prototype函数或属性返回Typescript中的子类型吗?
答案 0 :(得分:2)
Typescript不能准确建模所需的行为。
我能想到的最接近的方法是使用方法而不是属性。对于方法,我们可以定义一个this
参数并推断其类型并将其用作返回类型:
class Place extends Object{
next: Place;
}
let places: Place[] = [];
interface Object{
to<T>(this: T):T;
}
Object.prototype.to = function () {
return this;
};
places[0].to().next = new Place();
最简单的解决方案是对属性类型为多态this
的所有此类对象实际使用基类:
class Base {
get to(): this { return this; }
}
class Place extends Base{
next: Place;
}
let places: Place[] = [];
places[0].to.next = new Place();
注意:污染全局Object
似乎不是一个好主意,但最终这是您的要求。
答案 1 :(得分:0)
我找到了解决方法。
TS的返回类型为“ this”;
class Entity {
self() : this {
return this;
}
}
class Place extends Entity {
where(toGo:string) {
....
}
}
我可以使用类似的地方
new Place().self().where("Canada");
方法self
在超类中已取消,但可以返回子类类型。
因此,我可以使用场所实例而无需类型转换。