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