簡體   English   中英

Typescript環境聲明名稱空間

[英]Typescript ambient declaration namespace

最近,我將水療中心應用程序移至打字稿,現在我堅持實施用於openid身份驗證的rsa.js聲明文件。

以前使用過的Js代碼如下。

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

在rsa.d.ts文件中

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;
}

我不確定在這里做什么,請任何人指導我正確的方式。我如何定義像KJUR.jws.JWS這樣的命名空間以使用新的KJUR.jws.JWS();?

謝謝

首先,您的IJWS接口定義中存在一個錯誤。 它定義了一個類類的對象(帶有構造函數的東西),但沒有說明構造函數返回的內容,並且定義的方法附加到接口(即類本身)上,而不是構造函數返回的對象。 您真正想要的是一個類定義,而不是一個接口:

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

這可以更准確地表示您實際擁有的東西。 一旦知道了這很容易,您只需要從模塊內部( 操場鏈接 )中導出類即可。

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

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

如果您想定義一個“環境”模塊,則該方法有效:不需要顯式加載的模塊(即,表示運行時已經存在的全局變量的類型)。

如果你想使這個名字的模塊加載,通過節點模塊/ RequireJS /等等,你只需要該定義移動到一個單獨的文件,而不是使用一個命名空間的模塊,和周圍的名字加引號,如下游樂場

// 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中的。 如果您需要主動加載模塊以使其可用,則需要使用命名模塊語法(上面的第二個選項)。 如果它是一個已經存在的全局變量(您已經添加了一個腳本標簽),則應該只使用第一個選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM