2016-11-07 14 views
1

私のNode.js/Expressのアプリでは、私はこの内容とはかなりしばらくの間、Headers.tsファイル持っていた:それは、再び最近rm -rf node_modulesnpm install後、しかし、罰金コンパイルするために使用さTypeScriptモジュールの拡張により元のモジュールが上書きされますか?

type HttpHeader = 'X-My-Header' | 'X-My-Other-Header' | 'X-Another'; 

declare module 'express-serve-static-core' { 
    import * as http from 'http'; 
    interface Request extends http.IncomingMessage, Express.Request { 
     header(name: HttpHeader): string | undefined; 
    } 
} 

は、私はnode_modules/@types/express/index.d.tsは私の小さな増加にimport * as core from "express-serve-static-core"を解決し、完全に本物の読み込みをスキップすることを核心の問題があると思われ

error TS2339: Property 'get' does not exist on type 'Request'. 
error TS2339: Property 'end' does not exist on type 'Response'. 

ようなエラーの多くを取得しています。なぜ私はフォルダがあるのでわからない。node_modules/@types/express-serve-static-coreが正しくインストールされている。

何ができますか?判断

+0

あなたは何typescriptですバージョンを使用していますか?使用している構文は合法的ではありません(一般的に、モジュールの拡張の中にインポートを持つことはできません)。あなたは 'express-serve-static-core'をどこにでもインポートしていますか? – dtabuenc

+0

'Request'タイプをどのようにインポート/使用しているかの例も参考になります。 – dtabuenc

答えて

2

:あなたのモジュール宣言の内部

import * as http from 'http'; 

は、あなたが望むように、実際にモジュールを書く「agumentation」ではなく、むしろ既存のモジュールを交換します。あなたはこのようにそれを書くために必要となるモジュールの増強を書き込むためには

import { Request} from 'express-serve-static-core'; 
import * as http from 'http'; 

export type HttpHeader = 'X-My-Header' | 'X-My-Other-Header' | 'X-Another'; 

declare module 'express-serve-static-core'{ 
    export interface Request extends http.IncomingMessage, Express.Request { 
     header(name: HttpHeader): string | undefined; 
    } 
} 

注意すべき最初の事は、それは私が外部の「ファイル」モジュールはず(それが輸入を持つべきであるということで、輸出)。

注意すべき2つ目は内部の法的ではありませんでimport * as httpは、モジュールの増強外に出るべきであるということです。

宣言したモジュールは現在増強として厳密に機能します。既存のexpress-server-static-coreモジュールを上書きしたり置き換えたりすることはありません。実際には、そのモジュールは、それが(あなたがモジュール名のスペルを間違えた場合、それは例えば「コンパイルされないでしょう)、拡張されるために存在する必要があります。

あなたのコードが前に働いていた私はなぜあなたの例から言うことができません。おそらく、前にexpress-server-static-core宣言ファイルが実装されていた点に違いがあったでしょう。しかし、この例に従えば、物事はあなたのために働くはずです。

+0

あなたは 'import * as http'について本当ですか?活字体のコンパイラでも、私が(場合によっては)外側のスコープにインポートを移動してみなければならない明確なメッセージを持っているので、それは一種のそれが有効なインサイダーであることを前提としています。このアンビエント宣言は前もってコンパイルされており、モジュールの解像度でうまく動作しました。 – Borek

+0

はい私は肯定的です。あなたは正しいですが、それはうまくいくでしょうが、あなたの問題はグローバルな周囲の荒廃を使用するべきではありません。あなたがしようとしているのは、既存のモジュール内の** augment **型です。 'import'宣言はモジュール' augmentation'の中で**許可されていません。あなたは 'TS2667:モジュールの補強では輸入が許可されていません。 – dtabuenc

+0

Request Augmentation権利を行っているかどうかはわかりません。 https://github.com/DefinitelyTyped/DefinitelyTyped/blob/5bb102394148da1d481f2271cbde1b2bad330860/express-serve-static-core/index.d.ts#L13。しかし、それはどちらも私にとってはうまくいかない、私は別の質問を作成するだろうと思う。 – Borek

関連する問題