在工作中使用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 {}
或类似的方法,但是没有什么不同。
有什么想法吗?谢谢。