2017-12-30 22 views
-1

Ich habe die folgende Funktion:Weitergabe von Generika in Promise wie Promise <T>?

class RestService { 
    public async get<T>(func: string): Promise<T> { 
     var toRet = {}; 
     await fetch(EndPoint + func) 
     .then(response => response.json() as Promise<T>) 
     .then(data => { 
      toRet = data; 
     }) 
     .catch(e => { 
     }); 

     return toRet as T; 
    } 
} 

Alles funktioniert gut, aber die Antwort, die ich in ‚Daten‘ bekommen ist immer ein generisches Objekt.

Zum Beispiel habe ich ein Modell wie so haben könnte:

class Model 
{ 
    string name; 
} 

und rufen Sie die Funktion wie folgt:

get<Model>("getmodel") 

Die Antwort ist immer ein generisches Objekt, das wie folgt aussieht:

{name:"some name"} 

Von meinem Verständnis her werden Generika in Typoskript unterstützt und Versprechen nimmt variable Typen, meine einzige thou Ist das so, dass ich ein Generikum nicht zu einem Generikum machen kann?

+0

Wenn die Antwort, wenn immer ein Model, dann sollte die Methode nicht generisch sein, und sein Rückgabetyp sollte 'Promise ' sein.Hast du das gefragt? –

+0

Nun, die Antwort vom Endpunkt ist ein JSON-Objekt, das Modell stimmt einfach mit den JSON-Objektfeldern überein. Ich nehme Promise an, wo T ist, würde die Klasse eine Instanz der Klasse mit den JSON-Werten automatisch auffüllen. – tweetypi

+0

Also könnte ich einen Aufruf machen, um wie zu erhalten und einen Rückgabetyp von 'AnotherModel' zu erwarten, aber ich bekomme ein 'Objekt' mit Feldern, die den Variablendeklarationen in 'AnotherModel' entsprechen ... – tweetypi

Antwort

0

Vielleicht wäre es ein besserer Weg, um es zu schreiben.

class RestService { 
    public async get<T>(func: string): Promise<T | void> { 
     return await fetch('' + func) 
      .then(response => response.json() as Promise<T>) 
      .then(data => { 
       return data; 
      }) 
      .catch(e => { 
      }); 

    } 
} 

Sie können es auf dem Spielplatz sehen auch in diesem link.

Auf diese Weise müssen Sie keine Typen überschreiben und der Compiler kann alles selbst herausfinden.

Der Rückgabetyp ist jetzt Promise<T | void>, weil die catch-Funktion nichts zurückgibt. Sie könnten etwas anderes oder nichts haben, je nachdem, was Sie im Falle eines Fehlers tun.

Typescript wandelt das data Objekt nicht in den T Typ um, den Sie automatisch eingeben. Wenn Sie zum Beispiel die Methode mit get<AnotherModel>('modelEndpoint') aufrufen, gibt der Endpunkt Model zurück. Während der Typ zum Zeitpunkt der Erstellung sagt, dass Sie ein Objekt vom Typ AnotherModel zur Laufzeit erwarten, wird das Objekt tatsächlich vom Typ Model sein.

Dies ist von der Frage nicht klar, aber vielleicht Ihr Problem ist mit der Tatsache, dass die data vom Typ T ist anstelle den Promise<T>, die Sie im vorherigen then Rückruf zurück.

Wenn dies der Fall ist, ist das weil jede Promise, die als Rückruf an die then-Funktion gesendet wird, zuerst aufgelöst wird, bevor der äußere then aufgerufen wird.

Das bedeutet, dass Ihr Code entspricht.

.then(response => response.json().then((data) => data as T)) 
.then(data => { 
    return data; 
}) 

Es ist nur, dass die Verheißung api wird nur kümmern, dass für Sie.

Wenn Sie mehr über die Fallstricke von Promises in Javascript lernen möchten, ist diese post ziemlich gut.