打字稿:具有有效打字的“找不到模块”

Posted

技术标签:

【中文标题】打字稿:具有有效打字的“找不到模块”【英文标题】:Typescript: "Cannot find module" with valid typings 【发布时间】:2016-05-09 09:57:42 【问题描述】:

我刚刚使用 typescript 开始了一个新的 nodejs 项目。我安装了 Typings (https://github.com/typings/typings) 并用它来安装 node v4.x 和 express v4.x 的参考文件。

我的节点版本是v4.2.6 我的打字稿版本是 v1.7.5

我的项目目录是这样布局的:

package.json
tsconfig.json
typings.json
src/
  app.ts
typings/
  main.d.ts
  main/ambient/node/node.d.ts
  main/ambient/express/express.d.ts

typings/main.d.ts的内容如下:

/// <reference path="main/ambient/express/express.d.ts" />
/// <reference path="main/ambient/node/node.d.ts" />

tsconfig.json的内容如下:


  "compilerOptions": 
    "target": "es6",
    "module": "commonjs"
  

typings.json 的内容如下:


  "dependencies": ,
  "devDependencies": ,
  "ambientDependencies": 
    "express": "github:DefinitelyTyped/DefinitelyTyped/express/express.d.ts#dd4626a4e23ce8d6d175e0fe8244a99771c8c3f2",
    "node": "github:DefinitelyTyped/DefinitelyTyped/node/node.d.ts#1c56e368e17bb28ca57577250624ca5bd561aa81"
  

src/app.ts的内容如下:

'use strict';

///<reference path="../typings/main.d.ts"/>

import * as express from "express";

这非常简单,应该会生成一个基本的应用程序。但是,当我尝试编译时,我收到错误 error TS2307: Cannot find module 'express'.

我尝试重新排列类型文件,更改引用路径标签中的相对路径,使用 tsconfig.json 中的files 字段来指示引用路径,而不是在文件中使用内联标签,但都无济于事。我也尝试过直接在命令行上使用gulp-typescriptgulp-tsctsc进行编译。

当我尝试使用诸如cryptohttpfs 等 nodejs 内置模块时,我遇到了类似的错误。

这些引用似乎是有效的——我错过了什么?

【问题讨论】:

这都是有效的。分享项目,我帮你看看 非常感谢。 github.com/jereynolds/ts-test 我只是在四处寻找,我注意到引用路径注释仍然存在于 .js 输出文件中。导入语句确实被正确解析为标准的var express = require('express'); 【参考方案1】:

三斜杠指令需要在文件中的任何语句之前。您的"use strict" 序言需要您的参考 cmets 之后出现:

///<reference path="../typings/main.d.ts"/>

'use strict';

import * as express from "express";

作为您的评论的后续行动,您的导入没有得到任何发射:那是因为 TypeScript 执行导入省略。除非您将模块用于某个值,否则编译器不会发出导入,因为它假定您只需要该模块的类型。

【讨论】:

当我将三斜杠移动到"use strict"; 上方(或完全删除"use strict"; 行)时,我在编译步骤中遇到了一个额外的错误,即找不到 main.d.ts 文件,即使错误中给出的绝对路径正确指向文件 我们是否需要为我们使用的每种类型提供一个参考路径?对我来说,我必须找到 http-server 如果我也想使用 FS 怎么办? 如果您的 tsconfig.json 引用了这些文件,或者您引用了像 main.d.ts 这样已经列出它们的文件,那么您不需要引用这些文件。【参考方案2】:

Daniel 的回答在技术上是正确的,但根据您的 tsconfig main.d.ts 仍然会被选中,因此不会为您解决问题。

也就是说我确实发现了问题并发送了拉取请求:https://github.com/jereynolds/ts-test/pull/1


您可能应该排除 typingsnode_modules 否则编译将包含重复的标识符(类型)/会很慢(node_modules)

打字安装serve-staticexpress 需要)和mimeserve-static 需要)。

【讨论】:

“鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。” ——how-to-answer 我为serve-staticmime 安装了类型,将typingsnode_modules 文件夹添加到tsconfig.json 的排除列表中,并将"use strict"; 移动到引用标记之后.现在编译成功了tsc -p .,但是当我尝试使用 gulp 构建时仍然失败。关于为什么这不起作用的任何想法? @CSnover 我做到了。这两个要点是“重要链接中最相关的部分”:) @aaaarrgh 我不使用 gulp :)【参考方案3】:

我知道这是一个老问题,很抱歉碰到它,但它是 Google 的第一个链接之一。

由于上述内容并没有解决我的问题并且我最终解决了它,我想我会分享...就我而言,是相对路径导致了问题。

我的输入在

typings/bootstrap, typings/react-dom, typings/react, 等等。

react-dom 有一个import from 'react'。要修复我的代码,我必须将其编辑为 '../react/react'。简单!

【讨论】:

【参考方案4】:

以上都不适合我 - 所以我希望这对其他人有帮助。 (我正在使用 VS Code)。

这个问题突然发生在我的一项服务中,我在几个模块中都引用了该服务。在保存了一个完全不相关但不使用该服务的组件后,其中两个使用该服务的组件报告了“找不到模块”错误。我可以通过简单地将声明更改为无效文件夹、保存文件然后将其更改回正确的路径来修复它。

【讨论】:

以上是关于打字稿:具有有效打字的“找不到模块”的主要内容,如果未能解决你的问题,请参考以下文章

詹金斯错误:找不到模块'打字稿'

测试套件无法运行 - 找不到模块“打字稿”

电子 - 打字稿 - 找不到模块

如何将图像导入打字稿?他说“找不到模块”

库的打字稿声明文件找不到模块

“找不到模块 './style' 或其相应的类型声明”错误,打字稿 linter