typescript - 从 SomeType<T> 中提取类型 T

标签 typescript

我正在使用ReturnType<typeof function-name>提取返回类型 - 非常有用。

现在正好函数的返回类型是Promise,我想进一步提取类型参数,例如:

const someFunction = (): Promise<MysteryType> => { ... some code ... }

type TheReturnType = ReturnType<typeof someFunction>

type ExtractTypeFromPromise = UNKNOWN<TheReturnType>

这目前可能吗?

最佳答案

TypeScript 文档有一个名为 "Type inference in conditional types" 的部分Unpacked<T> 给出了一个很好的答案类型定义:

type Unpacked<T> =
    T extends (infer U)[] ? U :
    T extends (...args: any[]) => infer U ? U :
    T extends Promise<infer U> ? U :
    T;

以及一些结果示例:

type T0 = Unpacked<string>;  // string
type T1 = Unpacked<string[]>;  // string
type T3 = Unpacked<Promise<string>>;  // string

我不熟悉推断类型,所以感谢您帮助我学习新东西! :)


更新解决其他问题:

Is there a way to do this where you force the type at compile time to be of that instance.
Example: type T0 = UnpackedArray<string> // fail because it's not an Array

是的!可以使用extends对泛型类型进行约束。 :

type UnpackedArray<T extends Array<any>> =
    T extends (infer U)[] ? U : never;

type T2 = UnpackedArray<string[]>; // string
type T3 = UnpackedArray<string>;   // Error: Type 'string' does not satisfy the constraint 'any[]'.

关于typescript - 从 SomeType<T> 中提取类型 T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56844747/

相关文章:

reactjs - 如何对静态类成员使用查找类型?

javascript - Scala.js 可以生成 TypeScript d.ts 类型绑定(bind)吗?

javascript - 首次登录/导航后,Angular 6 样式无法正确加载

typescript - 函数类型和非函数类型之间的类型细化

typescript - Visual Studio 代码自动导入

reactjs - 处理未定义声明文件的正确方法 (index.d.ts)

Angular 6 - 隐藏或显示从服务触发的组件中的 Div

typescript - 如何从 Typescript 中固定对象的键创建映射类型

Angular 7 - typescript 语法

javascript - 如何使用 typescript 声明(.ts.d 文件)在 Angular cli 应用程序中使用第三方 javascript API/SDK?