1

@types/hapiに依存するノードアプリケーションがあります。このモジュールで定義されているクラスの1つにプロパティを追加したいと思います。私は、モジュールの増強を経由して私の新しいプロパティを定義しようとしました:モジュールの増強による既存のTypeScriptインターフェイスへのプロパティの追加は無効です

// my-custom-hapi-typings.d.ts 
import * as hapi from 'hapi'; 

declare module hapi { 
    interface Server { 
     myProperty: string; 
    } 
} 

これは、任意のコンパイルエラーが発生することはありませんが、それはまたServerクラスにmyPropertyプロパティを追加しません。私がしようとすると、このようなプロパティを参照するとき、私はまだ他の場所で私のプロジェクトでエラーが発生します:

// my-other-file.ts 
import * as hapi from 'hapi'; 

const server = new hapi.Server({ ... }); 

// error: Property 'myProperty' does not exist on type 'Server'. 
server.myProperty = 'hello'; 

活字体のコンパイラは私の.d.tsファイルを無視しているように見えるのはなぜ?ファイルを "インポート"する必要がありますか、何らかの理由でこのファイルが存在することをTypeScriptコンパイラに認識させますか?私は、.d.tsファイルをソースディレクトリに配置するだけで、TypeScriptがこれらの機能強化を引き受けるのに十分であるという印象を受けました。

+0

トップレベルの 'import'はファイルをモジュールにします。削除してください。 – Aaron

+0

@Aaronさん、ありがとうございましたが、トップレベルの 'import'を削除しようとしましたが、結果は同じです。 –

+1

"hapi"を引用符で囲みます: 'declare module" hapi "' 'Server'インターフェースを' export 'する必要があるかもしれません。 – Aaron

答えて

1

これはあなたの問題である:

declare module hapi { 

これは実際には「内部モジュール」と呼ばれるように使用前の日付ES6モジュール古い構文を使用して、namespaceを定義しています。 module hapiを書くことは今日の好ましい構文であるnamespace hapiを書くことと同じです。 declare an external moduleMore on namespaces vs modules here.

あなただけの引用符でモジュール名を入れる必要があります:[...]

周囲の名前空間に似た構文を使用しますが、我々はのmoduleキーワードと引用符付きの名前を使用後でインポートするために使用できるモジュール。言い換えれば

、ちょうど引用符でhapiを置く:

declare module "hapi" 

を今、あなたは周囲my-custom-hapi-typings.d.tsを直接インポートする必要はありません)外部モジュール定義は(何import "hapi"を宣言していあなたの中に宣言されているものを増やすことができます。

module hapimodule "hapi"in the Playgroundにマウスポインタを重ねるには、あなたがツールチップの違いが表示されます場合は、次の enter image description here

enter image description hereはい、それはその背後にある歴史による微妙と紛らわしいです。

+0

@Aaronの徹底的な説明をありがとう。私が必要とした唯一の変更は '' hapi''を引用符で囲むことでした。 'import'文を削除した場合、私の宣言は* hapiモジュール定義を上書きする*のように見えます。*アクセスできる唯一のプロパティは自分で定義したものです。ですから、私は 'import'ステートメントが拡張のために必要だと思います。 –

+1

@NathanFriend Hm、そうです。実際には、それをモジュールにする、あるいはモジュールであるトップレベルの 'export'は、' declare module "hapi"の効果を実際に変更しないと思います。また、モジュール宣言の内部でインポートすることもできます。私は私の答えを編集します...この答えを誰かに誤解させたくありません。 :) – Aaron

関連する問題