从SomeType <T>中提取类型T

时间:2019-07-02 03:00:14

标签: typescript

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

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

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

type TheReturnType = ReturnType<typeof someFunction>

type ExtractTypeFromPromise = UNKNOWN<TheReturnType>

这当前可行吗?

1 个答案:

答案 0 :(得分:4)

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

我不熟悉推断类型,因此感谢您帮助我学习新知识! :)


更新解决了其他问题:

  

有没有一种方法可以在编译时强制类型属于该实例。
  示例: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[]'.