已解决的承诺类型

Chu*_*est 19 typescript

我想使用函数的返回类型在界面上键入一个项目,如下所示:

const returnsPromise = async (): Promise<string> => {
  return Promise.resolve('I want the string type and not a Promise')
}

interface Myinterface {
  message: ReturnType<typeof returnsPromise>
}
Run Code Online (Sandbox Code Playgroud)

但是,消息的类型是Promise而不是string。人们可以得到 Promise 应该解决的类型吗?

jca*_*alz 24

TypeScript 4.5 引入了typeAwaited<T>,如果您输入awaittype 的值,它就T会计算出您获得的类型。所以你可以写:

interface Myinterface {
  message: Awaited<ReturnType<typeof returnsPromise>>;
  // (property) Myinterface.message: string
}
Run Code Online (Sandbox Code Playgroud)

如果您还没有 TypeScript 4.5,您始终可以使用条件类型推断Promise自行“取消”类型:

type Unpromise<T> = T extends Promise<infer U> ? U : never;

interface Myinterface {
  message: Unpromise<ReturnType<typeof returnsPromise>>;
  // (property) Myinterface.message: string
}
Run Code Online (Sandbox Code Playgroud)

string当你传入 时,它们都会产生Promise<string>。对于更复杂的类型(例如嵌套Promise),它们会产生不同的结果:

type APPs = Awaited<Promise<Promise<string>>>; // type APPs = string
type UPPs = Unpromise<Promise<Promise<string>>>; // type UPPs = Promise<string>
Run Code Online (Sandbox Code Playgroud)

因此,是否需要递归地计算“承诺解决的问题”取决于您的用例。

Playground 代码链接