2017-11-30 1 views
2

Ja, tut mir leid wegen des schrecklichen Titels für diese Frage, aber es ist schwer zu erklären. Viel einfacher, etwas Code zu zeigen und zu fragen, warum funktioniert das nicht so, wie ich es vorhabe?:Inherring generic type Parameter basierend auf einem anderen generischen 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>` 

Eine editierbare Version des obigen Codes can be found here.

ich nicht einmal sicher bin, ob dies möglich ist, aber ich möchte Typoskript der Lage sein, den Rückgabetyp von doYourThing() abzuleiten basiert auf der Tatsache, dass das Argument vom Typ Doer<U> und dem eigentlichen Argument ist vom Typ Doer<Promise<string>> .

Ist das, was ich versuche, sogar möglich (ich bin gerade auf TypScript 2.4.2)?

Wenn ja, was mache ich hier falsch?

Antwort

3

Leider funktioniert die Vereinheitlichung von höher-kinded Typisierung nicht out-of-the-box. Es gibt eine etwas peinlichere "abgeflachte" Kodierung von HKTs, die in "leichtgewichtiger höherer Schreibweise" (TypeScript-Beispiele here) beschrieben sind, aus der Sie möglicherweise eine bessere Schlussfolgerung ziehen können.

Zum Glück für Ihr Beispiel gibt es einen einfacheren Weg, Dinge neu zu ordnen:

... 

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

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