获取已解决的承诺的返回类型?

Ste*_*sen 12 typescript

我想创建一个具有一些默认值的变量,它是从 Promise 解析的返回类型的扩展接口。我的功能是这样的:

function getAge(): Promise<number> {
  return new Promise((resolve) => {
  resolve(42)
  })
}
Run Code Online (Sandbox Code Playgroud)

我的变量的默认值是:

let user: { name: string, age: number } = { name: "", age: 0 }
Run Code Online (Sandbox Code Playgroud)

我尝试过使用 ReturnType<>,但是Promise<number>当我只想返回数字时,我似乎只能获取返回类型。

JCa*_*Cat 17

Typescript 4.5 中的更新

您可以使用新的Awaited类型

例如:

let bar: Awaited<ReturnType<typeof foo>>
Run Code Online (Sandbox Code Playgroud)

这基本上与上面的示例相同UnboxPromise,但是 Awaited 可以递归地解开 Promise 的包装。

旧答案

我喜欢上面的答案(UnboxPromise示例)。

或者,您可以定义类似于 ReturnType 的类型,仅将返回值作为承诺。

type ReturnPromiseType<T extends (...args: any) => Promise<any>> = T extends (...args: any) => Promise<infer R> ? R : any;
Run Code Online (Sandbox Code Playgroud)

例子:

// Our declared type
type ReturnPromiseType<T extends (...args: any) => Promise<any>> = T extends (...args: any) => Promise<infer R> ? R : any;

// Let's imagine that we do not have direct access to this type (a typical case when using external libraries)
interface Foo {
    a: string
}

// Here we already have access to the function, but we still don't have access to the return type.
function foo(): Promise<Foo> {
    return Promise.resolve({
        a: "abc"
    })
}

(async () => {
    let bar: ReturnPromiseType<typeof foo> // returns our interface/type Foo
    let baz: any // any by default

    bar = await foo();
    baz = await foo();

    // typeof bar
    // in IDE shows - let bar: Foo
    // typeof bar.a
    // in IDE shows - (property) Foo.a: string
    
    //typeof baz
    // in IDE shows - any
    //typeof baz.a
    // in IDE shows - any
})();

Run Code Online (Sandbox Code Playgroud)

在 Typescript Playground 中


Tit*_*mir 9

您可以使用条件类型来提取 Promise 的值类型:

function getAge(): Promise<{ name: string, age: number }> {
  return new Promise((resolve) => {
  resolve({ name: "", age: 42 })
  })
}

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

let user: UnboxPromise<ReturnType<typeof getAge>> = { name: "", age: 0 }

Run Code Online (Sandbox Code Playgroud)

在此处阅读有关条件类型的更多信息