[英]Infer Typescript class to return the generic type based of generic value
[英]Infer typescript generic wrapper function return type property value
如何正確推斷data
的xxx
類型?
限制:
Promise<{ xxx: Data; }>
Promise<{ xxx: Data; }>
- 目前有效。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
a
與D
直接相關的類型。 這是最簡單的方法:
function wrapper<D>(a: Promise<{xxx: D}>): Promise<{ data: D }> {
return 1 as any
}
您並沒有真正在代碼中使用A
,所以我將其遺漏了。 相反,我們說a
是Promise<{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.