2017-09-27 2 views
1

Ich versuche herauszufinden, wie man das macht, was ich als "verschachtelte Typ-Assertion" bezeichnen würde.Typescript - verschachtelte, mehrfache Assertion

Typoskript ermöglicht es Ihnen, ein leeres Objekt über eine Schnittstelle als den Typ der Schnittstelle darzustellen. Zum Beispiel:

const fakeRequest = <ExpressCore.Request>{ protocol: 'test-protocol' }; 

Lassen Sie uns mich geben ein Objekt mit dem Protokollfeld Satz, der als ExpressCore.Request Typ wirkt (die viele Eigenschaften- https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/express-serve-static-core/index.d.ts#L177 hat). Ich kann dies bequem verwenden, um ein Request-Objekt zu nehmen und eine Aussage über das Protokoll zu machen.

Wenn ich versuche, dies mit einer komplexeren Schnittstelle zu tun, zum Beispiel, die ein für Anfrage - https://github.com/request/request - der Compiler sagt ich ich habe drei Innen-Typen zur Verfügung zu stellen:

Generictype 'RequestAPI<TRequest, TOptions, TUriUrl> requires 3 type argument(s). 

ich tue Dies geschieht mit den @ types/request typings, die über DefinitelyTyped verfügbar sind.

In der Deklarationsdatei wird RequestAPI definiert durch:

daran gearbeitet

export interface RequestAPI<TRequest extends Request, TOptions extends CoreOptions, TUriUrlOptions> {

haben, ich habe ein Objekt über eine Schnittstelle zu behaupten, erfordert eine innere Schnittstelle gefunden Beispiele für die Syntax erforderlich:

const pos = <GeoJSON.Feature<GeoJSON.GeometryObject>>{ 
    "type": "Feature", 
    "properties":{}, 
    "geometry": { 
    "type": "Point", 
    "coordinates": [0, 1] 
    } 
}; 

Siehe What means "Generic type 'Feature<T>' requires 1 type argument(s)" in Typescript?.

Ich kann jedoch nicht herausfinden, wie man das mit drei inneren Schnittstellen macht. Die folgenden Versuche sind gescheitert:

const foo = { {} as request.Request, {} as request.CoreOptions, {} as request.RequiredUriUrl } as request.RequestAPI; 

const fakeRequester = <request.RequestAPI<request.Request><request.CoreOptions><request.RequiredUriUrl>> {{}, {}, {}}; 

etc ..

Wenn jemand weiß, wie eine verschachtelte, mehrere Behauptung zu handhaben oder könnte darauf hinweisen, was ich falsch mache, es geschätzt würde.

Antwort

1

Ich musste etwas über generische Typparameter lesen, aber schließlich war es machbar.

Um herauszufinden, was los war habe ich ts-node verwendet und kleine Schnittstellen, die sich gegenseitig und andere, die sie als generische Parameter verwendet, erweitert.

Schließlich konnte ich das Request-Objekt in meinem Test verspotten; zum Beispiel:

const fn: (options: (request.CoreOptions & request.UriOptions), callback?: request.RequestCallback) => any = 
     function(options: (request.CoreOptions & request.UriOptions), cb?: request.RequestCallback) { 
      expect(options.uri).to.equal('http://foo/id-xyz'); 
      done(); 
      return <request.Request>{}; 
     }; 

    const fakeRequester = <request.RequestAPI<request.Request, request.CoreOptions, {}>>fn; 

    const agent = _agent(fakeRequester); 

    agent('http', '/foo/id-xyz', { 'Accept-Encoding': 'gzip' }, fakeWritable(), (err, result) => {}); 
});