我得到 File node_modules/@types/webrtc/index.d.ts is not a module with this code:
import * as webrtc from "webrtc";
const peerConnection1 = new RTCPeerConnection();
我已经使用 npm i @types/webrtc --save-dev
安装了类型。在 Visual Studio Code 中将鼠标悬停在 const peerConnection1 = new RTCPeerConnection();
中的 RTCPeerConnection
上,这样至少代码编辑器可以看到类型。运行 tsc
(或带有 ts-loader
的 webpack
)失败并出现错误。
我已经尝试过 npm i webrtc --save
来解决这个问题,但它并没有改变任何东西,而且我真的只想要打字,WebRTC 就在浏览器中,我不需要一个包。 (支持一边。)
index.d.ts
文件确实不是一个模块,它只是引用了另外两个带有接口的文件。所以我想删除 import * as webrtc from "webrtc";
,希望 tsc
以某种方式仍然可以看到输入。 (但这是不可能的,因为我在 TypeScript 配置文件中排除了 node_modules
。)当我这样做时,不再识别 RTCPeerConnection
。
添加 /// <reference src="node_modules/@types/webrtc/" />
没有帮助,tsc
说 引用指令语法无效。
您可以查看具有最少重现 here on GitLab 的存储库。我不太精通 TypeScript 类型的获取,所以如果我要解决这一切都错了,请原谅我的无知。
webrtc 是浏览器的一部分;您正在尝试导入模块。只需导入(打字)库:
import "webrtc";
您可能需要在编译器选项中使用 "moduleResolution": "node"
。
或者,使用 "types": ["webrtc"]
编译器选项,编译器会自动为您加载这些类型。
在 vscode 中
Ctrl + Shift + p > 开发人员:重新加载窗口
您可能想要添加
"types": ["webrtc"]
到您的 tsconfig.json
,或者不太推荐使用
/// <reference types="webrtc" />
在您的源文件中。这是您的 tsconfig.json
中的一个示例:
{
"compilerOptions": {
"target": "es5",
"sourceMap": true,
"noImplicitAny": true,
"types": ["webrtc"]
},
"exclude": [
"node_modules"
]
}
这告诉 TypeScript 它应该在你的构建中包含 webrtc
声明
另一种选择是在您的模块中添加一个新的声明文件 *.d.ts
,即:
declare module 'my-module';
无需导入任何东西,运行以下命令:
npm install --save @types/webrtc update tsconfig.json - "types": [ "@types/webrtc" ]
npm install --save-dev @types/...
是首选 - 通常,TS 不用于生产
/// <reference types="@types/<your_types_module>" />
根据您的构建和样式需求,您可能想要也可能不想这样做,但这似乎是快速(和肮脏)的修复。
在我的情况下,这是一个损坏的依赖项,删除模块并 npm install
完成了工作。
就我而言,我收到此错误消息,其中包含由 TypeScript 编译器生成的 index.d.ts
文件。
问题是我忘记在源 .ts
文件中指定任何 import
或 export
声明。从 .js
移植到 .ts
时,我删除了原来的 module.export = {…}
位,并且还没有替换它。
这就是 the docs 定义“模块”的方式(强调):
在 TypeScript 中,就像在 ECMAScript 2015 中一样,任何包含顶级导入或导出的文件都被视为一个模块。相反,没有任何顶级导入或导出声明的文件被视为其内容在全局范围内可用的脚本(因此也可用于模块)。
将 export
添加到我打算导出的内容中,将 index.d.ts
变成了一个模块,从而清除了错误。
使用要求
const webRtc = require('webrtc');
你进口应该很好
types
否则只有那些类型会被加载 - 通常node_modules/@types
中的所有内容都会被加载,这将阻止这种行为。这些天你只需要npm i @types/webrtc
。tsconfig.json
相对于node_modules
目录的放置位置。