簡體   English   中英

根據TypeScript中的另一個通用參數推斷通用類型參數

[英]Inferring generic type parameter based on another generic parameter in TypeScript

是的,對於這個問題的標題很抱歉,但是很難解釋。 顯示一些代碼要簡單得多,並問為什么這不符合我的預期?

interface Doer<U> {
    doStuff: () => U;
}

class Promiser implements Doer<Promise<string>> {
    doStuff() {
        return Promise.resolve('foo');
    }
}

export interface Type<T> extends Function {
    new (...args: any[]): T;
}

function doYourThing<T extends Doer<U>, U>(doer: Type<T>): U {
    return new doer().doStuff();
}

const result = doYourThing(Promiser);
// type of "result" is `{}`
// I want it to be `Promise<string>`

可以在此處找到上述代碼的編輯版本。

我什至不確定這是否可行,但我希望TypeScript能夠基於參數為Doer<U>類型且實際參數為類型的事實來推斷doYourThing()的返回類型。 Doer<Promise<string>>

我什至嘗試過(我現在正在使用TypeScript 2.4.2)嗎?

如果是這樣,我在這里做錯了什么?

不幸的是,像這樣的統一類型的統一無法立即使用。 在“輕量級更高種類的類型”( 此處為 TypeScript示例)中概述的HKT的“扁平化”編碼略顯笨拙,您可以從中更好地進行推斷。

幸運的是,有一個更簡單的方法來重新安排事情:

...

function doYourThing<T>(doer: Type<Doer<T>>): T {
    return new doer().doStuff();
}

const result = doYourThing(Promiser);
// result is `Promise<string>`

暫無
暫無

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

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