正确使用Typescript.d.ts文件

正确使用Typescript.d.ts文件,typescript,visual-studio-2015,typescript-typings,Typescript,Visual Studio 2015,Typescript Typings,我试图弄清楚TypeScript.d.ts文件到底是如何工作的。我很难理解以下两者之间似乎存在的差异: 编译程序 Intellisense(使用ReSharper的VS2015) 运行时/模块加载器(Systemjs) 我使用的是oidc客户端js库,它提供了一个oidc-client.d.ts文件,看起来有点像下面的: 声明var UserManager:Oidc.UserManager; ... 更多的东西 声明模块“oidc客户端”{ 出口=Oidc; } 声明命名空间Oidc{ 接口客户

我试图弄清楚TypeScript.d.ts文件到底是如何工作的。我很难理解以下两者之间似乎存在的差异:

  • 编译程序
  • Intellisense(使用ReSharper的VS2015)
  • 运行时/模块加载器(Systemjs)
  • 我使用的是oidc客户端js库,它提供了一个oidc-client.d.ts文件,看起来有点像下面的:

    声明var UserManager:Oidc.UserManager;
    ... 更多的东西
    声明模块“oidc客户端”{
    出口=Oidc;
    }
    声明命名空间Oidc{
    接口客户端{
    …更多的东西
    }
    接口OidcManager扩展OidcClient{
    …更多的东西
    }
    …更多的东西
    }
    
    我希望在我自己的TypeScript类中使用UserManager类,从而执行以下操作:

    //
    导出类安全服务{
    私有管理器:Oidc.UserManager;
    构造函数(){
    this.manager=新的Oidc.UserManager({
    …在这里设置
    });
    }
    }
    
    此时会发生以下情况(
    指向正确的文件):

  • 编译器会抱怨在
    新的Oidc.UserManager()调用上没有Oidc命名空间
  • Intellisense还抱怨缺少Oidc符号
  • 不编译,所以也不运行
  • 因此,为了取悦编译器,我可以将代码更改为此(注意从
    new-Oidc.UserManager
    更改为
    new-UserManager

    //
    导出类安全服务{
    私有管理器:Oidc.UserManager;
    构造函数(){
    this.manager=新用户管理器({
    …在这里设置
    });
    }
    }
    
    这具有以下效果:

  • 编译器将不再抱怨
  • 智能感知也很快乐
  • 运行应用程序时,我收到一个错误,指出UserManager不存在。这是正确的,因为在oidc客户端js库中,所有类实际上都在oidc命名空间中。因此创建对象的正确方法是
    新建oidc.UserManager()
  • 解决此问题的另一种方法是将代码更改为此(注意添加的
    declare var Oidc

    //
    声明变量Oidc;
    导出类安全服务{
    私有管理器:Oidc.UserManager;
    构造函数(){
    this.manager=新的Oidc.UserManager({
    …在这里设置
    });
    }
    }
    
    这将:

  • 让编译器高兴
  • 诱使intellisense认为Oidc下的任何内容都属于
    any
    类型,这显然不是最优的
  • 在运行时工作正常
  • 到目前为止,我发现的唯一一个在所有方面都有效的解决方案是将.d.ts文件更改为使用类而不是接口:

    声明var UserManager:Oidc.UserManager;
    …更多的东西
    声明模块“oidc客户端”{
    出口=Oidc;
    }
    声明命名空间Oidc{
    类OIDClient{
    …更多的东西
    }
    类OidcManager扩展OidcClient{
    …更多的东西
    }
    …更多的东西
    }
    
    但这需要对定义文件进行更改。查看其他定义文件,它们通常使用接口而不是类,因此我想知道这是否是定义文件的问题,或者这只是我对TypeScript中如何工作缺乏正确的理解


    任何帮助都将不胜感激。

    我认为这只是定义文件的问题

    定义文件说应该有一个
    var UserManager:Oidc.UserManager
    可用。这就是为什么编译器在使用
    new UserManager()
    时不会抱怨,因为定义文件说它存在

    问题是它实际上不存在(在JavaScript中),因此出现运行时错误


    此文件可能不正确,因为它已过时。我找到了一个文件,您可能想尝试一下。

    您是对的。我可能应该更新我的问题。我是提供更新定义文件的人:)谢谢though@Robba我应该注意到:P无论如何,很乐意帮忙!