Создавайте типизированный объект динамически, используя TypeScript и вывод типа - PullRequest
0 голосов
/ 31 марта 2020

Можно ли динамически построить полностью типизированный объект в 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, сопоставлять с ним дополнительные объекты и возвращать полностью типизированный результат (но с как можно меньше данных). В настоящее время я пишу много кода, который по сути делает то же самое, но необходимо для обеспечения безопасности типов в базе кода.

...