簡體   English   中英

推斷 typescript 通用包裝器 function 返回類型屬性值

[英]Infer typescript generic wrapper function return type property value

如何正確推斷dataxxx類型?

限制:

  • 包裝參數應該只接受Promise<{ xxx: Data; }> Promise<{ xxx: Data; }> - 目前有效。
  • 只能更改包裝器

Typescript沙箱

function wrapper<
    Data,
    A extends Promise<{ xxx: Data; }>,
    >(a: A): Promise<{ data: Data }> {
    return 1 as any
}


async function a(): Promise<{ xxx: string }> {
    return { xxx: 'a' }
}


wrapper(a()).then(res => {
    const data: string = res.data // is unknown, how to make it infer string?
})

大概您希望編譯器將A推斷為Promise<{ xxx: string }> ,並從那里將Data推斷為string ,因為A extends Promise<{xxx: Data}> 不幸的是,在 TypeScript 中,像extends Promise<{xxx: Data}>這樣的通用約束不能作為類型參數的推理站點。 (此類行為在microsoft/TypeScript#7234中提出,但從未實現。)因此編譯器不知道將Data推斷為什么,因此它會回退到unknown類型 哎呀。

為了從 a 獲得對Data的推斷(我將其重命名為D以更符合類型參數的通常命名約定),您需要給a aD直接相關的類型。 這是最簡單的方法:

function wrapper<D>(a: Promise<{xxx: D}>): Promise<{ data: D }> {
    return 1 as any
}

您並沒有真正在代碼中使用A ,所以我將其遺漏了。 相反,我們說aPromise<{xxx: D}>類型。 編譯器可以通過將Promise<{xxx: string}>匹配到Promise<{xxx: D}>來推斷D

讓我們看看它的實際效果:

wrapper(a()).then(res => {
    const data: string = res.data // okay
});

看起來挺好的。

游樂場代碼鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM