是否可以使用指定的属性名称和类型推断在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中选择实体,将其他实体映射到该实体,然后返回完全类型化的结果(但要尽可能少的数据)。目前,我正在编写许多代码,这些代码本质上是相同的,但是必须这样做以确保代码库中的类型安全。