最近我将我们的spa应用程序移动到了打字稿,现在我坚持实现用于openid身份验证的rsa.js的declation文件。
以前使用的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();?
由于
答案 0 :(得分: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;
}
}
如果你想定义一个'环境'模块:不需要显式加载的模块(即表示已经在运行时存在的全局类型)。
如果你想通过名称,通过Node modules / 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中加载的。如果您需要主动加载模块以使其可用,则需要使用命名模块语法(上面的第二个选项)。如果它已经存在已经存在的全局(你已经有一个已添加它的脚本标记),那么你应该只使用第一个选项。