TypeScript 打字给我“index.d.ts 不是模块”
Posted
技术标签:
【中文标题】TypeScript 打字给我“index.d.ts 不是模块”【英文标题】:TypeScript typings give me "index.d.ts is not a module" 【发布时间】:2017-03-19 09:13:13 【问题描述】:我得到 File node_modules/@types/webrtc/index.d.ts is not a module 使用此代码:
import * as webrtc from "webrtc";
const peerConnection1 = new RTCPeerConnection();
我已经使用npm i @types/webrtc --save-dev
安装了类型。将鼠标悬停在 const peerConnection1 = new RTCPeerConnection();
中的 RTCPeerConnection
上会在 Visual Studio Code 中显示类型注释,因此至少代码编辑器可以看到这些类型。运行 tsc
(或 webpack
和 ts-loader
)失败并出现错误。
我尝试过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 类型的获取不太精通,所以如果我做错了,请原谅我的无知。
【问题讨论】:
【参考方案1】:在 vscode 中
Ctrl + p > 开发者:重新加载窗口
【讨论】:
【参考方案2】:就我而言,我收到此错误消息,其中包含由 TypeScript 编译器生成的 index.d.ts
文件。
问题是我忘记在源 .ts
文件中指定任何 import
或 export
声明。从.js
移植到.ts
时,我删除了原来的module.export = …
位,还没有替换它。
这就是the docs 定义“模块”的方式(已添加重点):
在 TypeScript 中,就像在 ECMAScript 2015 中一样,任何包含***导入或导出的文件都被视为一个模块。相反,没有任何***导入或导出声明的文件被视为脚本,其内容在全局范围内可用(因此也可用于模块)。
将export
添加到我打算导出的内容中,将index.d.ts
变成了一个模块,从而清除了错误。
【讨论】:
【参考方案3】:在我的情况下,这是一个损坏的依赖项,删除了模块,npm install
完成了工作。
【讨论】:
不幸的是,有时这可能是一个解决方案【参考方案4】:使用要求
const webRtc = require('webrtc');
你导入应该很好去
【讨论】:
【参考方案5】:/// <reference types="@types/<your_types_module>" />
您可能希望也可能不希望这样做,具体取决于您的构建和样式需求,但这似乎是快速(且肮脏)的解决方法。
【讨论】:
【参考方案6】:另一种选择是在你的模块中添加一个新的声明文件*.d.ts
,即:
declare module 'my-module';
【讨论】:
【参考方案7】:不需要导入任何东西,运行以下:
npm install --save @types/webrtc
更新 tsconfig.json -
“类型”:[ “@types/webrtc” ]
【讨论】:
这将使得只导入 webrtc 类型。不要更新 tsconfig.json。npm install --save-dev @types/...
是首选 - 通常,TS 不用于生产【参考方案8】:
webrtc 是浏览器的一部分;您正在尝试导入模块。只需导入(类型)库:
import "webrtc";
您可能需要在编译器选项中使用"moduleResolution": "node"
。
或者使用"types": ["webrtc"]
编译器选项,编译器会自动为您加载这些类型。
【讨论】:
【参考方案9】:你可能想添加
"types": ["webrtc"]
发给你的tsconfig.json
,或者不太推荐使用
/// <reference types="webrtc" />
在您的源文件中。这是您的tsconfig.json
中的一个示例:
"compilerOptions":
"target": "es5",
"sourceMap": true,
"noImplicitAny": true,
"types": ["webrtc"]
,
"exclude": [
"node_modules"
]
这告诉 TypeScript 它应该在你的构建中包含 webrtc
声明
【讨论】:
不要设置types
,否则只有这些类型会被加载——通常node_modules/@types
中的所有内容都会被加载,这将阻止这种行为。这些天你只需要npm i @types/webrtc
。
@aendrew 这并不完全正确,因为这取决于您的 tsconfig.json
相对于您的 node_modules
目录的位置。
是的,这只是让 TS 不加载任何其他类型,即使对于我的本地应用程序模块,它现在也会吐出数千个关于缺少类型的错误...以上是关于TypeScript 打字给我“index.d.ts 不是模块”的主要内容,如果未能解决你的问题,请参考以下文章
打字稿:React Native useRef 给出错误“对象可能为空”
React 本机流程、打字稿和 Visual Studio Code