TS类型:如何访问模块内部的名称空间?

时间:2019-02-11 13:15:10

标签: typescript typescript-typings

在工作中使用Typescript时,我在项目或NPM上的@types中遇到了许多没有类型的依赖项。对于某些人,我可以自己创建一个视频播放器的质量检查库youbora(here is the public source code @ bitbucket),但我无法创建它们:特别是我陷入了命名空间的困扰。

Youbora通过创建插件并注册适配器来让开发人员使用它。

import * as youbora from "youboralib";
import "youbora-adapter-shaka";

// ---- in my classes ----

this.youbora = new youbora.Plugin({ ... });

在另一个类/组件中(我们正在使用与打字稿反应):

this.props.youbora.setAdapter(
    new youbora.adapters.Shaka(document.getElementById("videoContent"))
);

Typescript告诉我“ youboralib”(NPM上的软件包名称)没有声明文件。因此,我通过查看源代码创建了它。

declare module "youboralib" {
  class Plugin {
    constructor(options: YouboraNS.PluginOpts, adapter?: YouboraNS.Adapter);
    setAdapter(adapter: YouboraNS.Adapter): void
    // ...
  }

  namespace adapters {}

  namespace YouboraNS {
    interface PluginOpts {}
    interface Adapter {
      plugin: any
    }
    interface Communication {}
  }
}

由于我们仅包含Plugin类,所以没有问题。

根据源代码,

Youbora.adapters是一个空对象,由导入的适配器填充(如上面的youbora-adapter-shaka)。因此,可以如上所述进行new youbora.adapters.Shaka(...)

就类型而言,它应该是一个命名空间(按书面规定)。 问题是,如果我在模块中声明一个名称空间,则不能从外部访问它,而只能从内部访问(如YouboraNS):实际上,VSCode仅建议我使用Plugin类。我在网络和SO上进行了不同的搜索,但没有结果。

所以这里的问题是:如何访问特定于模块的名称空间?

要绕过此问题,我必须禁用标志tsconfig.CompilerOptions.noImplicitAny和/或在说明上方使用@ts-ignore,但这是一个丑陋的解决方案。

======================

如果您查看the code of youboralib.js,您会发现实际上“ youbora”本身可以被视为一个名称空间,因为它是一个具有不同属性的对象。

因此,我尝试将其定义为名称空间,但是VSCode仍无法将其识别为模块:

export = youboralib;
export as namespace youboralib;

declare namespace youboralib {
  class Plugin { ... }
  namespace adapters {}
}

我也尝试过export namespace adapters {}或类似的方法,但是没有什么不同。

有什么想法吗?谢谢。

0 个答案:

没有答案