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

Typescript 获取已解决承诺的返回类型?,typescript,Typescript,我想创建一个带有一些默认值的变量,这是一个promise中解析返回类型的扩展接口。我的功能类似于: function getAge(): Promise<number> { return new Promise((resolve) => { resolve(42) }) } 我已尝试使用ReturnType,但似乎只有在我只想返回数字时才能获得返回类型承诺。您可以使用条件类型提取承诺的值类型: function getAge(): Promise<{ nam

我想创建一个带有一些默认值的变量,这是一个promise中解析返回类型的扩展接口。我的功能类似于:

function getAge(): Promise<number> {
  return new Promise((resolve) => {
  resolve(42)
  })
}

我已尝试使用ReturnType,但似乎只有在我只想返回数字时才能获得返回类型
承诺。

您可以使用条件类型提取承诺的值类型:

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 }

函数getAge():Promise{
返回新承诺((解决)=>{
解析({name:,年龄:42})
})
}
键入unexpromise我喜欢上面的答案(
unexpromise
example)

或者,您可以定义一个类似于ReturnType的类型,只使用返回值作为承诺

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

type ReturnPromiseType Promise

这太棒了。我是否可以将自己的属性添加到返回的类型中?假设我想返回一个带有推断类型的类型以及一些其他键。像
unexpromise=T这样的东西扩展了承诺?{…U,…I}:永远不会
@StephanOlsen这是交叉口类型的一种情况:
类型UnboxPromise=T扩展承诺?U&I:别傻了,我应该试一下。谢谢你的帮助。
type ReturnPromiseType<T extends (...args: any) => Promise<any>> = T extends (...args: any) => Promise<infer R> ? R : any;
// 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
})();