Создание универсального сеттера c для частных свойств - PullRequest
1 голос
/ 19 апреля 2020

У меня есть класс с несколькими закрытыми свойствами различных типов, для которого я хочу создать один универсальный c publi c Set метод.

class A {

  private prop1: Array<A> = new Array()
  private prop2: Array<[A,A]> = new Array()
}

// Set method that can be used in following way: 
// a.Set('prop1', new Array<A>())
// a.Set('prop2', new Array<[A, A]>())
// but not:
// a.Set('prop3', ...)
// a.Set('prop1', 23)

По сути, я хочу метод Set, который имеет: Первый параметр ограничен набором частных свойств из A. Идеально автоматически перечисляется, но поскольку keyof не обрабатывает частные свойства, рукописный набор подходит (например, type AProps = 'prop1'|'prop2'). Второй параметр ограничен типом свойства, соответствующим первому параметру.

Т.е. что-то вроде этого (я знаю, это не работает), где PropType<A, property>) выбирает правильный зависимый тип объединения из всех возможных PropType s из A:

type PropType<TObj, TProp extends keyof TObj> = TObj[TProp];
class A {

  private prop1: Array<A> = new Array()
  private prop2: Array<[A,A]> = new Array()

  public Set(property: keyof A, value: PropType<A, property>) {
    this[property] = value
  }

Я на 90% уверен, что это не может быть сделано в текущей системе типов TS разумно безопасным способом.

Хотя декоратор может быть полезен, его (пока) нельзя использовать из-за невозможности изменить класс / интерфейс цели: https://github.com/microsoft/TypeScript/issues/4881


Я знаю, что я Можно создавать методы установки вручную. Я также знаю, что могу создать такой, который будет использовать трюк, подобный this . Я не спрашиваю об этом. Я знаю, что есть много обходных путей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...