в Typescript может ли функция Object.prototype возвращать экземпляр типа Sub? - PullRequest
0 голосов
/ 26 декабря 2018

Я хочу написать код, подобный

class Place {
  next: Place;
  get to() : Place {
    return this;
  }
}
let places : Place[]= [];
..

places[0].to.next = new Place();

Существует много похожих классов, поэтому я хочу определить свойство to для Object.prototype.

Object.defineProperty(Object.prototye,"to",{
  get: function() {
    return this;
  }
});

Но компиляция не удалась из-за Property 'next' does not exist on type 'Object'

Могу ли я вернуть подтип в Typescript с помощью функции или свойства Object.prototype?

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Я нашел какое-то решение.

TS имеют тип возврата "this";

class Entity {
  self() : this {
    return this;
  } 
}

class Place extends Entity {
  where(toGo:string) {
    ....
  }
}

и я могу использовать место как

new Place().self().where("Canada");

метод self объявлен в суперклассе, но он может возвращать тип подкласса.

Итак, я могу использовать экземпляр места без приведения типов.

0 голосов
/ 26 декабря 2018

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 не кажется хорошей идеей, но в конечном итоге это ваш призыв.

...