在Typescript中,Object.prototype函数可以返回Sub类型实例吗?

时间:2018-12-26 03:58:46

标签: javascript typescript get subtype defineproperty

我想编写类似

的代码
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中的子类型吗?

2 个答案:

答案 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在超类中已取消,但可以返回子类类型。

因此,我可以使用场所实例而无需类型转换。