Можно ли динамически построить полностью типизированный объект в TypeScript, используя указанные имена свойств и вывод типа?
Лучшее решение, которое я в настоящее время смог придумать, - это создать класс, который имеет обобщенный c свойство (требуемый объект) и универсальная c функция для добавления типизированных ключей к объекту.
class DynamicPropsTest<T = object> {
props: T;
constructor(props?: T) {
if (props) {
this.props = props;
}
}
addProp<U>(name: string, value: U) {
return new DynamicPropsTest({
...this.props,
[name]: value
});
}
}
const propTest = new DynamicPropsTest()
.addProp('key1', 'string-value')
.addProp('key2', true)
.addProp('key3', 5);
Приведенное выше решение, к сожалению, создает только действительно открытые типы, где все свойства будут иметь комбинацию все указанное набрано. Т.е. результирующий тип будет выглядеть следующим образом:
interface DynamicObject {
[key: string]: string | boolean | number;
}
Но для того, чтобы получить нужный динамически типизированный объект (), он тоже должен выглядеть так, как показано ниже:
interface DynamicObject {
key1: string;
key2: boolean
key3: number;
}
Более того невозможно получить прямой доступ или переназначить свойства, так как tslint кричит, что любой ключ объекта имеет тип never
, но я надеюсь, что если возможно построить объект, как описано, он сможет получить доступ к типизированным свойствам объект.
PS Желательно использовать для такого высокодинамичного построителя объектов c выбор объектов из хранилища Rx Js, сопоставлять с ним дополнительные объекты и возвращать полностью типизированный результат (но с как можно меньше данных). В настоящее время я пишу много кода, который по сути делает то же самое, но необходимо для обеспечения безопасности типов в базе кода.