2017-09-27 6 views
1

私は 'ネストされた型アサーション'と呼ばれると思われることをどうやって解決しようとしています。Typescriptネストされた複数の型アサーション

Typescriptを使用すると、インターフェイスを介して空のオブジェクトをアサートし、インターフェイスの種類としてポーズを設定できます。たとえば:

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

ましょう私は(https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/express-serve-static-core/index.d.ts#L177多くのプロパティ - を持っている)ExpressCore.Requestタイプとして動作するプロトコルフィールドが設定されたオブジェクトを指定します。私はこれを便利に使用して、Requestオブジェクトを取得し、プロトコルについてのアサーションを行うことができます。

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

私がやっている:

私は例えば、より複雑なインターフェイスでこれをしようとすると、要求のために提供1 - - https://github.com/request/requestは、コンパイラが私に語った私は3つのインテリア種類を提供する必要がありますこれは、DefinitelyTypedを介して利用可能な@ types/requestタイピングを使用します。宣言ファイルで

は、RequestAPIはによって定義される:

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

これに取り組んできたが、私は1つの内部インターフェースを必要インターフェイスを介してオブジェクトをアサートするために必要な構文の例を見つけた:

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

What means "Generic type 'Feature<T>' requires 1 type argument(s)" in Typescript?を参照してください。

しかし、3つの内部インターフェイスでこれを行う方法を考えることはできません。下記の試みが失敗している:誰もが、ネストされた、複数のアサーションを処理する方法を知っているか私が間違ってやっていると指摘することができれば

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

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

などを...

を、それが理解されるだろう。

答えて

1

ジェネリック型パラメータについては読んでおかなければなりませんでしたが、最終的には実行可能でした。

私はts-nodeを使用し、互いに拡張した小さなインターフェイスと、それらをジェネリックパラメータとして使用したインターフェイスを構築しました。

最終的に、テストでRequestオブジェクトをモックできました。例えば:

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) => {}); 
}); 
関連する問題