2016-04-12 3 views
1

で機能を拡張:は、私はJavaScriptで書かれたNode.jsのモジュールのこのタイプを持って活字体

function main(options) { 
    return "some string"; 
} 

main.methodName = function() { 
    // implementation; 
}; 

main.objectName = { 
    // a namespace; 
}; 

main.propertyName = 123; 

module.exports = main; 

活字体で、そのようなインターフェースを宣言するの適切な方法は何ですか?

明確化

私はそれが活字ファイルから正しく使用できるように、適切に既存のNode.jsのモジュールのために活字体で、このようなインタフェースを宣言する方法についての質問ではなく、どのように再実装なんですTypeScriptのインターフェイスその後

import * as myModule from "my-module"; 
var s = myModule({}); 

私は:私はこのようにそれを使用する場合でも、

declare module "my-module" { 

    // Default library interface 
    interface main { 
     (options?:{}):string, 
     methodName():any, 
     propertyName:any, 
     objectName:Object 
    } 

    export default main; 
} 

:@toskvからの提案に続き

UPDATE

は、私は、次のインターフェイスが追加されましたエラーCannot invoke an expression whose type lacks a call signature.が発生しました。

理由は何ですか?そのコードを記述

+1

活字体が有効なJavaScriptでこのコードを意味するJavaScriptのスーパーセットであり、また有効活字体です。 –

+0

@Gothdoそれが真実である間、TypeScriptは静的型付けのために型が定義された後にオブジェクトを拡張するのに苦労します。関数にプロパティを追加する。コードをクラスに変換する方がずっと簡単で洗練されています。 :) – toskv

答えて

3

活字体インターフェースは次のようになります

interface MainIf { 
    (options) : string ; // the main function 
    methodName() : any; 
    propertyName: number; 
    objectName: Object; 
} 
+0

確かに彼はしませんが、これはこのようにクリーナーです。 :)代わりに、メイン関数に追加のプロパティを追加するときに、タイプアサーションをに追加することです。私はそれも例に挙げるでしょう。 :) – toskv

+0

私は多分いくつかの誤解があると思います。私は同じ方法で動作する新しいクラスを実装する方法ではなく、既存のNode.jsモジュールの宣言インタフェースを求めていました。 –

+0

@ vitaly-t typescriptコンパイラで動作するように現在のコードをパッチするだけの別の例を追加しました。生成された2のjsコードは同等でなければなりません。 – toskv

関連する問題