2016-05-03 14 views
0

最近私はspaアプリケーションをtypescriptに移しました。そして今、私はopenid認証に使用されているrsa.jsのデクレーションファイルを実装しています。Typescriptアンビエント宣言ネームスペース

以前に使用されたJsコードは以下のとおりです。 rsa.d.tsファイル内

var jws = new KJUR.jws.JWS(); 
jws.verifyJWSByPemX509Cert(idToken, cert); 

declare namespace KJUR.jws { 
    interface IParsedJWS { 
     payloadS: any 
    } 
    interface IJWS { 
     new(); 
     verifyJWSByPemX509Cert(idToken: string, cert: string): boolean; 
     parsedJWS: IParsedJWS; 
    } 
} 

declare var JWS: KJUR.jws.IJWS; 
declare module "KJUR.jws.JWS" { 
    export = JWS; 
} 

イムない誰かが私にway.How私はKJUR.jws.JWSのような名前空間を定義することができる権利を導く何イムがhere.Pleaseやってください新しいKJUR.jws.JWS();を使用してください。

ありがとうございました

答えて

1

最初に、IJWSインターフェイスの定義にバグがあります。これはクラスのようなオブジェクト(コンストラクタを持つもの)を定義しますが、コンストラクタから返されるオブジェクトではなく、コンストラクタから返されるオブジェクトではなく、インターフェイス(つまりクラス自体)に定義されたメソッドが追加されます。ここで本当に欲しいのは、インターフェースではなく、クラス定義です。

class JWS { 
    verifyJWSByPemX509Cert(idToken: string, cert: string): boolean; 
    parsedJWS: IParsedJWS; 
} 

これは実際にあなたが実際に持っているものをより正確に表しています。それが簡単であれば、モジュール内部からクラスをエクスポートするだけです(playground link)。

declare namespace KJUR.jws { 
    interface IParsedJWS { 
     payloadS: any 
    } 

    export class JWS { 
     verifyJWSByPemX509Cert(idToken: string, cert: string): boolean; 
     parsedJWS: IParsedJWS; 
    } 
} 

あなたは「周囲」モジュールを定義したい場合、これは動作します:明示的なロード(既に実行時に存在するために起こっているグローバルを表す、すなわち種類)を必要としないモジュールを。

ノードモジュール/ RequireJS/etcを使用して名前でロード可能なモジュールにする場合は、その定義を別のファイルに移動し、名前空間の代わりにモジュールを使用し、名前の周りに引用符を追加するだけです、playground以下のように:

// In a separate file, e.g. "KJUR.d.ts": 
declare module "KJUR.jws" { 
    interface IParsedJWS { 
     payloadS: any 
    } 

    export class JWS { 
     verifyJWSByPemX509Cert(idToken: string, cert: string): boolean; 
     parsedJWS: IParsedJWS; 
    } 
} 

// Elsewhere: 

// (The string below and the module name above need to match what RequireJS 
// is expecting, or it'll compile, but fail to find the module at runtime. 
// You can change them to anything you like, as long as they match.) 
import jws = require("KJUR.jws"); 

var idToken: string; 
var cert: string; 

var jws = new jws.JWS(); 
jws.verifyJWSByPemX509Cert(idToken, cert); 

主な違いは、このKJURオブジェクトが実行時に実際にJavaScriptでロードされる方法です。モジュールを使用可能にするために積極的にロードする必要がある場合は、名前付きモジュール構文(上記の2番目のオプション)を使用する必要があります。それがすでに存在するグローバル(すでに追加しているスクリプトタグを持っている)ならば、最初のオプションを使用するだけです。

+0

ごanswer.rsa.jsためのおかげで、実際にモジュールを有する第二option.Changing名前空間にそうイムrequirejsを使用してimpotキーワードを使用してインポートするオンデマンドでロードされているように見えるべきか、インポート部分がわからないme.Imに同意しませんか? '{ インタフェースIParsedJWS { ペイロードモジュール "KJUR.jws" を宣言:任意 }インターフェイスIJWS { 新しいです(); verifyJWSByPemX509Cert(idToken:string、cert:string):ブール値。 parsedJWS:IParsedJWS; } export = IJWS; } ' – sercan

+0

私は完全な例で質問を更新しました。あなたのコメントでは、インターフェースをエクスポートするだけで、インターフェースが記述するタイプの変数ではありません。近づくために、それはので、私の答えの上からクラス問題対インタフェースの、まだ正確ではありません;:あなたはタイプIJWS( '' IJWS輸出するvar JWS)の変数をエクスポートすることができます。あなたはクラスをエクスポートしたい。 –

関連する問題