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(或 webpackts-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 文件中指定任何 importexport 声明。从.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 不是模块”的主要内容,如果未能解决你的问题,请参考以下文章

开玩笑不使用 fs/promises 打字稿

typescript 打字稿鸭打字

打字稿:React Native useRef 给出错误“对象可能为空”

React 本机流程、打字稿和 Visual Studio Code

Typescript 2 + Angular googlemaps 打字稿定义

TypeScript 条件类型和计算对象属性名称