打字稿:自动从类型中剥离Promise <>?

时间:2019-11-26 13:40:59

标签: typescript

我有一个类似于以下数据模型的内部表示形式:

class InternalDataClass {
    propOne?: Promise<string>;
    propTwo?: Promise<number>;
    propThree?: string;
    ...
}

某些属性是Promise,因为它们是由异步进程填充的。但是,由于这是一个Web服务,因此我想以有线形式(显然没有Promises)向客户公开此结构。像这样:

class ExternalDataClass {
    propOne?: string;
    propTwo?: string;
    propThree?: string;
}

是否有一种简便的方法可以在Typescript中完成而不必重新声明所有内容?在我的情况下,这尤其相关,因为是的,这里的插图只有3个属性,但是您可以想象一个数据类会变得更大!

谢谢! 蒂姆

1 个答案:

答案 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) {

}

Playground Link