Typescript环境声明命名空间



最近我把我们的spa应用程序移到了typescript,现在我坚持实现rsa.js的解密文件,该文件用于openid身份验证。

以前使用的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;
    }
}

如果你想定义一个"环境"模块:一个不需要显式加载的模块(即表示在运行时已经存在的全局的类型),这是有效的。

如果你想通过Node modules/RequieJS/等使其成为一个可通过名称加载的模块,你只需要将该定义移动到一个单独的文件中,使用一个模块而不是名称空间,并在名称周围添加引号,如下所示:操场:

// 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中。如果需要主动加载模块才能使其可用,则需要使用命名模块语法(上面的第二个选项)。如果它是一个已经存在的全局(您有一个已经添加它的脚本标记),那么您应该只使用第一个选项。

最新更新