我有一个类似于以下数据模型的内部表示形式:
class InternalDataClass {
propOne?: Promise<string>;
propTwo?: Promise<number>;
propThree?: string;
...
}
某些属性是Promise,因为它们是由异步进程填充的。但是,由于这是一个Web服务,因此我想以有线形式(显然没有Promises)向客户公开此结构。像这样:
class ExternalDataClass {
propOne?: string;
propTwo?: string;
propThree?: string;
}
是否有一种简便的方法可以在Typescript中完成而不必重新声明所有内容?在我的情况下,这尤其相关,因为是的,这里的插图只有3个属性,但是您可以想象一个数据类会变得更大!
谢谢! 蒂姆
答案 0 :(得分:2)
您可以使用条件类型来“解包”承诺:
class InternalDataClass {
propOne?: Promise<string>;
propTwo?: Promise<number>;
propThree?: string;
}
type UnpackAny<T> = T extends Promise<infer U> ? U: T
type UnpackProperties<T> = {
[P in keyof T]: UnpackAny<T[P]>
}
type ExtrnalInterface = UnpackProperties<InternalDataClass>
// type ExtrnalInterface = {
// propOne?: string | undefined;
// propTwo?: number | undefined;
// propThree?: string | undefined;
// }
如果您真的想创建一个类而不是仅创建一个类型,则可以强制实现ExtrnalInterface
:
class ExtrnalDataClass extends (class { } as new () => ExtrnalInterface) {
}