使用TypeScript动态创建类型化对象并进行类型推断

时间:2020-03-31 19:31:41

标签: generics typescript-typings type-inference typescript-generics typescript3.0

是否可以使用指定的属性名称和类型推断在TypeScript中动态构建完全类型化的对象?

我目前能想到的最好的解决方案是建立一个具有通用属性(所需对象)和用于向该对象添加类型化键的通用函数的类。

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,因此无法直接访问或重新分配属性,但我希望,如果有可能像描述的那样构建对象,访问对象的类型化属性。

P.S。这种高度动态的对象构建器的理想用法是从RxJs Store中选择实体,将其他实体映射到该实体,然后返回完全类型化的结果(但要尽可能少的数据)。目前,我正在编写许多代码,这些代码本质上是相同的,但是必须这样做以确保代码库中的类型安全。

0 个答案:

没有答案