【问题标题】:Typescript: automagically strip Promise<> from types?打字稿:自动从类型中剥离 Promise<>?
【发布时间】:2019-11-27 02:10:44
【问题描述】:

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

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

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

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

有没有一种简单的方法可以在 Typescript 中完成此操作而无需重新声明所有内容?这在我的案例中尤其相关,因为,是的,我在这里的插图只有 3 个属性,但您可以想象一个数据类变得越来越大!

谢谢! 时间

【问题讨论】:

  • 相关? stackoverflow.com/questions/48944552/… - UnPromisifiedObject/UnPromisify 似乎是个不错的候选人。
  • 可以接受ExternalDataClass 作为类型别名而不是类吗?
  • @Caramiriel,这有点不同,因为这涉及展开(即完全解析)对象上的任何 Promise 属性。在将数据传输到网络之前,我实际上在我的 Web 服务中做了类似的事情。但我纯粹是在寻找一种方法来定义一种供客户使用的类型。下面的答案完美地做到了!

标签: typescript


【解决方案1】:

您可以使用条件类型来“解包”承诺:

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

【讨论】:

  • 太棒了!我知道必须有一些 Typescript 技巧才能做到这一点!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2013-03-17
  • 2018-01-04
  • 2020-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-19
  • 1970-01-01
相关资源
最近更新 更多