2016-05-03 4 views
0

Недавно я переместил наше спа-приложение на машинопись, и теперь я застрял в реализации файла declation rsa.js, который используется для аутентификации openid.namescript namespace

Ранее использованный 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; 
} 

Я не уверен, что им делать here.Please кто направлять мне право way.How я могу определить пространство имен, как KJUR.jws.JWS к используйте новый 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; 
    } 
} 

Это работает, если вы хотите, чтобы определить модуль «окружающей среды»: модуль, который не нуждается в явной загрузки (т.е. типы, представляющие глобальный, который уже будет существовать во время выполнения).

Если вы хотите сделать этот модуль загружаемым по имени, через 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 во время выполнения. Если вам нужен модуль для активной загрузки, чтобы он стал доступен, вам нужно использовать синтаксис именованного модуля (второй вариант выше). Если это глобальный, который уже существует (у вас есть тег скрипта, который уже добавляет его), тогда вы должны просто использовать первый вариант.

+0

Спасибо за ваш answer.rsa.js на самом деле загружен по требованию с использованием requirejs, поэтому im на второй опции. Изменение пространства имен с модулем и импорт с использованием ключевого слова impot не согласуются со мной. Не уверен, какая часть импорта должна выглядеть? 'Объявить модуль "KJUR.jws"{ интерфейс IParsedJWS { : любой полезных нагрузки } интерфейс IJWS { новых(); проверкаJWSByPemX509Cert (idToken: string, cert: string): boolean; parsedJWS: IParsedJWS; } export = IJWS; } ' – sercan

+0

Я обновил вопрос с полным примером. В своем комментарии вы просто экспортируете интерфейс, а не переменную с типом, который описывает интерфейс. Вы можете экспортировать переменную типа IJWS ('export var JWS: IJWS;'), чтобы приблизиться, но это все еще не так, из-за проблемы с интерфейсом vs class в верхней части моего ответа. Вы хотите экспортировать класс. –