TypeScript:将类型解析器对象映射到结果类型

时间:2019-12-05 14:08:20

标签: typescript

如果我有这样的界面:

interface GetDomainInfoResolver {
  getDomainInfo: (domain: string) => Promise<DomainInfoType>
}

我如何创建一个映射类型,以产生如下所示的接口/类型:

interface GetDomainInfoService {
  getDomainInfo: DomainInfoType
}

这样我就可以这样使用它:

type GetDomainInfoService = Transform<GetDomainInfoResolver>

这有可能吗?

背景是我想在GraphQL服务器解析器(TypeGraphQL)和客户端(@ apollo / react-hooks)之间创建类型接口。

非常感谢您。

1 个答案:

答案 0 :(得分:3)

您可以使用映射类型来映射属性,并使用条件类型获取返回类型(使用ReturnType<T[P]>)以提取承诺值类型:

interface GetDomainInfoResolver {
  getDomainInfo: (domain: string) => Promise<DomainInfoType>
}

type GetAllResults<T extends Record<keyof T, (...a: any[]) => any>> = {
    [P in keyof T]: ReturnType<T[P]> extends Promise<infer U> ? U : never
}

type GetDomainInfoService = GetAllResults<GetDomainInfoResolver>
// Same as
// type GetDomainInfoService = {
//     getDomainInfo: DomainInfoType;
// }

Playground Link