2016-11-12 10 views
2

nodejs moduleモジュールのプロトタイプを修正したいと思います。"TypeScriptスタイル"のプロトタイプ関数を外部モジュールに追加する方法は?

@types/nodeは、この(NodeModule)のために定義されたインタフェースを持っていますが、私は、モジュールをimportときは何も持っていないので、私はそれrequireに持っています。

import * as Module from "module"; // Error 
var Module = require("module"); // Ok 

問題は、Moduleには定義がないことです。 anyとして返されます。

私は私自身のCustomNodeModuleインターフェイスを作成する必要がありますが、どのように私はModuleプロトタイプを変更することができますし、また、これらの機能は、彼らがCustomNodeModuleインスタンスの一部であることを知っているこの

export interface CustomNodeModule extends NodeModule { 
    __thingy:()=>void; 
} 

Module.prototype.__thingy = function() { 
    // things! 
} 

がありますか?

答えて

1

declare module "module" { 
    export = Module; 

    var Module: ModuleConstructor; 

    interface ModuleConstructor { 
     new (id: any, parent: any): NodeModule; 
     readonly prototype: NodeModule; 

     Module: typeof Module; 
     globalPaths: string[]; 
     /** @deprecated */ 
     requireRepl(...args: string[]): any; 
     runMain(): void; 
     wrap(script: any): any; 
     wrapper: string[]; 
    } 
} 

注:これでDefinitelyTypedにプルリクエストを送信するには、おそらく受け入れられます。

次に、あなたが実際に新しいプロパティをタックモジュールでは、あなたが書くことができます。

import m = require("module"); 

// This is a *global augmentation*. 
// It adds to declarations in the global scope. 
declare global { 
    interface NodeModule { 
     __thingy:() => void; 
    } 
} 

m.prototype.__thingy = function() { 
    // ... 
}; 
+0

自分のモジュールを作成する必要があります。ありがとうございました! +1は「これはグローバルな拡張*です。」です。ここで重要だった。 –

+0

問題はまだ解決されていることに気付きました。 '__thingy()'関数は 'this'が' NodeModule'であることをまだ知りません。 –

+0

'__thingy'の型に' this'型の注釈を追加することができます( '' __thingy:(this:NodeModule)=> void')型関数は後で関数本体自体の 'this'型を推測することができます。もっと読む[ここ](https://github.com/Microsoft/TypeScript/wiki/What's-new-in-TypeScript#specifying-the-type-of-this-for-functions)を有効にし、 '--noImplicitThis '安全であること。 –

2

TypeScriptインターフェイスは開いているので、別のインターフェイスを作成する必要はありません。既存のメソッドを使用して既存のインターフェイスを拡張できます。いくつかのグローバルファイル(なしインポート/エクスポートと1)、以下を追加して

export interface NodeModule { 
    __thingy:()=>void; 
} 
+0

ああ、それは本当です。私は数ヶ月前にTypeScriptを使い始めたときにそれを読んでいたことを覚えています: -/+1そのため –

+0

今重要な質問は、どのようにNodeModuleであることを知るようにModuleプロトタイプを上書きできますか? –

+0

ああ、今私はこれをやった理由を覚えています。私がインタフェースを拡張しないとき、 'NodeModule'は(おそらく' @ types'から来ているので分かりませんが)混在していないので、私はカスタムインタフェースを作成しました。大したことではありませんでした。特定のケースでより良い解決策がある場合は、http://i.imgur.com/VtQHOyb.pngとhttp://i.imgur.com/ojd2APj.png –

関連する問題